2

C#でソルトを使用してハッシュする必要がある文字列があり、PHPでのハッシュと一致します。C# コードは次のとおりです。

        string stringToHash = "123";
        string saltToUse = "321";
        byte[] stringBytes = ASCIIEncoding.ASCII.GetBytes(stringToHash);
        byte[] saltBytes = ASCIIEncoding.ASCII.GetBytes(saltToUse);

        var hmacMD5 = new HMACMD5(saltBytes);
        var saltedHash = hmacMD5.ComputeHash(stringBytes);
        byte[] hashedBytesNoSalt = MD5CryptoServiceProvider.Create().ComputeHash(stringBytes);

        string hashedString = BitConverter.ToString(hashedBytesNoSalt).Replace("-", "").ToLower();
        string saltedString = BitConverter.ToString(saltedHash).Replace("-", "").ToLower();

C# が正しく出力されているかどうかをテストする PHP コードは次のとおりです。

<?php echo md5('123'.'321'); ?>

C# は、202cb962ac59075b964b07152d234b70 である正しい UNSALTED MD5 ハッシュを出力します。ただし、C# を使用してソルトしようとすると、900011ae860f471561023fba6cc25df6 が返され、PHP では c8837b23ff8aaa8a2dde915473ce0991 が返されます。

なぜこれを行っているのか、これが正しい方法なのかはわかりません。覚えておくべきことは、C# は PHP が出力するものに出力する必要があるということです。

4

2 に答える 2

2

C# コードは、PHP コードよりも優れたソルティング メカニズムを使用しています。stringToHash + saltToUsePHP に合わせるには、HMACMD5 の重要な機能を使用する代わりにMD5 を実行するだけです。要するに、C# でソルトなしの MD5 を生成するために行ったのとまったく同じことを行いますが、stringToHash + saltToUse代わりに渡します。

于 2013-08-26T19:12:10.373 に答える
1

ソルトは秘密鍵と同じではありません。HMACMD5あなたが望むのは塩漬けのMD5ハッシュだけである場合、秘密鍵を使用します。正しいキーを生成するには、文字列にソルトを追加するだけです... stringToHash + saltToUse.

ここについて読むHMACMD5: http://msdn.microsoft.com/en-us/library/yd9e7dt2.aspx

于 2013-08-26T19:15:22.923 に答える