1

Crypto-JS v2.5.3 (hmac.min.js) http://code.google.com/p/crypto-js/ライブラリを使用してクライアント側のハッシュを計算します。スクリプトは次のとおりです。

$("#PasswordHash").val(Crypto.HMAC(Crypto.SHA256, $("#pwd").val(), $("#PasswordSalt").val(), { asByte: true }));

これは次のようなものを返します:

b3626b28c57ea7097b6107933c6e1f24f586cca63c00d9252d231c715d42e272

次に、サーバー側で次のコードを使用してハッシュを計算します。

private string CalcHash(string PlainText, string Salt) {
        string result = "";
        ASCIIEncoding enc = new ASCIIEncoding();
        byte[]
        baText2BeHashed = enc.GetBytes(PlainText),
        baSalt = enc.GetBytes(Salt);
        System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
        byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
        result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x")).ToArray());
        return result;
    }

このメソッドは以下を返しました。

b3626b28c57ea797b617933c6e1f24f586cca63c0d9252d231c715d42e272

ご覧のとおり、サーバー側のメソッドがそれを無視するゼロ文字がいくつかあります。問題はどこだ?サーバー側の方法に問題はありますか? この2つの値が同じで、文字列と塩が等しい必要があります。

4

3 に答える 3

4

ご覧のとおり、サーバー側のメソッドがそれを無視するゼロ文字がいくつかあります。問題はどこだ?

ここ - C# での 16 進数への変換:

b => b.ToString("x")

が 10 の場合b、「0a」ではなく「a」が返されます。

個人的には、より単純な 16 進変換をお勧めします。

return BitConverter.ToString(baHashedText).Replace("-", "").ToLowerInvariant();

(代わりに に変更して、2 文字の長さを指定することもできますが、それでもバイトから 16 進への変換を実行する方法はやや遠回りです。)"x""x2"

于 2012-08-21T06:28:57.750 に答える
2

他の誰もが、BitConverter を使用して「-」をトリミングしたり、ToString(x2). 1.1 SoapHexBinaryから .NET にあるクラスという、より良い解決策があります。

using System.Runtime.Remoting.Metadata.W3cXsd2001;

public byte[] StringToBytes(string value)
{
    SoapHexBinary soapHexBinary = SoapHexBinary.Parse(value);
    return soapHexBinary.Value;
}

public string BytesToString(byte[] value)
{
    SoapHexBinary soapHexBinary = new SoapHexBinary(value);
    return soapHexBinary.ToString();
}

これにより、必要な正確な形式が生成されます。

于 2012-08-21T06:52:29.087 に答える
1

問題はここにあると思います:

result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x")).ToArray());

次のように変更します。

result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x2")).ToArray());
于 2012-08-21T06:30:39.353 に答える