半径和 EAP 计算消息身份验证器
本文关键字:消息 身份验证 计算 EAP | 更新日期: 2023-09-27 18:37:04
我一直在阅读RFC 3579,因为我正在实现一个支持EAP-MD5身份验证的RADIUS服务。不幸的是,我有点不确定如何解释RFC,尤其是在尝试计算消息身份验证器时。
我基本上创建一个 HMAC-MD5 对象(我使用的是 C#)使用 NAS 的共享密钥作为密钥并连接类型(一个字节)+ 标识符(一个字节)+ 长度(两个字节)+ 请求身份验证器(16 字节)+ 所有属性(访问请求中的消息身份验证器除外),但计算值与数据包中的值不匹配。
遵循 RFC,这似乎是正确的。我是否正确解释了 RFC?
这是代码:
RadiusPacket packet = Objects.Packet;
byte[] toHMAC;
toHMAC = new byte[1] { (byte)packet.Code };
toHMAC = ByteArray.Combine(toHMAC, new byte[1] { packet.Identifier });
// reversed to match endian of packet
toHMAC = ByteArray.Combine(toHMAC, ByteArray.Reverse(packet.LengthAsBytes));
toHMAC = ByteArray.Combine(toHMAC, packet.Authenticator);
for (int i = 0; i < packet.Attributes.Length; i++)
{
if (packet.Attributes[i].Type != RadiusAttributeType.MessageAuthenticator)
{
toHMAC = ByteArray.Combine(toHMAC, packet.Attributes[i].RawData);
}
}
HMACMD5 md5 = new HMACMD5(Encoding.ASCII.GetBytes(Objects.NAS.SharedSecret));
// this DOES NOT match what is in the received packet...
byte[] hmac = md5.ComputeHash(toHMAC);
任何帮助将不胜感激。
我通过重新阅读 RFC 和查看 JQuery 中的一些源代码的组合找到了答案。这是我为其他任何有相同情况的人发现的
RFC (3579) 内容如下:
"计算消息完整性检查时,签名字符串应被视为零的十六个八位字节。"
收到访问请求数据包后,我用 16 个零字节替换了现有的消息身份验证器,然后用 HMAC-MD5 替换了整个数据包,并将计算值与数据包中的消息身份验证器进行比较。
代码要简单得多(我从wireshark捕获创建了一个测试数据包):
// a radius-eap packet captured from wireshark
RadiusPacket packet = new RadiusPacket(ByteArray.FromHex("017600ad375be8f596e90bcffc5e32929d14275b04060a3e01ee05060000c3513d060000000f011f686f73742f64727377696e377472616379702e6472736c2e636f2e756b1e1330302d31322d30302d45332d34312d43311f1342342d39392d42412d46322d38412d44360606000000020c06000005dc4f240200002201686f73742f64727377696e377472616379702e6472736c2e636f2e756b5012c93ef628690a578b31709b0bbccade41"));
// identical packet that I can zero out MA for testing
RadiusPacket radiusPacketCopy = new RadiusPacket(ByteArray.FromHex("017600ad375be8f596e90bcffc5e32929d14275b04060a3e01ee05060000c3513d060000000f011f686f73742f64727377696e377472616379702e6472736c2e636f2e756b1e1330302d31322d30302d45332d34312d43311f1342342d39392d42412d46322d38412d44360606000000020c06000005dc4f240200002201686f73742f64727377696e377472616379702e6472736c2e636f2e756b5012c93ef628690a578b31709b0bbccade41"));
// zero out MA
radiusPacketCopy.ZeroMessageAuthenticator();
// hash it up
HMACMD5 md5 = new HMACMD5(Encoding.ASCII.GetBytes("mykey"));
byte[] hmac = md5.ComputeHash(radiusPacketCopy.RawPacket);
// the message authenticator MUST be correct
if (!ByteArray.AreEqual(hmac, packet.MessageAuthenticator))
{
// etc
你的代码很接近,但并不完全在那里。您正在完全去除Message-Authenticator
属性。
相反,它应该保留在数据包中的原始位置,但该属性的 16 字节value
字段应用零覆盖。