3

EAP-MD5 認証をサポートする RADIUS サービスを実装しているので、RFC 3579 を読んでいます。残念ながら、特に Message-Authenticator を計算しようとすると、RFC を解釈する方法が少しわかりません。

私は基本的に HMAC-MD5 オブジェクトを作成します (私は C# を使用しています) キーに NAS の共有シークレットを使用し、タイプ (1 バイト) + 識別子 (1 バイト) + 長さ (2 バイト) + 要求オーセンティケーター (16 バイト) を連結します+ すべての属性 (Access-Request の Message-Authenticator を除く) が、計算された値がパケットの値と一致しません。

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);

どんな助けでも大歓迎です。

4

2 に答える 2

2

RFC を読み直し、JQuery のソース コードを調べて、答えを見つけました。これは、同じことをしている他の人のために私が見つけたものです

RFC (3579) には次のように書かれています。

「メッセージの整合性チェックが計算されるとき、署名文字列はゼロの 16 オクテットと見なされるべきです。」

Access-Request パケットを受信したら、既存の Message-Authenticator を 16 のゼロ バイトに置き換えてから、パケット全体を HMAC-MD5 し、計算された値をパケット内の Message-Authenticator と比較しました。

コードははるかに単純です (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
于 2012-06-12T19:28:24.713 に答える
0

あなたのコードは近いですが、完全ではありません。Message-Authenticator属性を完全に削除しています。

代わりに、パケット内の元の位置に残す必要がありますがvalue、その属性の 16 バイト フィールドはゼロで上書きする必要があります。

于 2016-10-05T16:05:44.947 に答える