16

なぜこれらは同じではないのですか?

php:

    $hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );

c#

    public static string ComputeHash(string plainText, string salt)
    {
        // Convert plain text into a byte array.
        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] saltBytes = Encoding.UTF8.GetBytes(salt);

        SHA256Managed hash = new SHA256Managed();

        // Compute hash value of salt.
        byte[] plainHash = hash.ComputeHash(plainTextBytes);

        byte[] concat = new byte[plainHash.Length + saltBytes.Length];

        System.Buffer.BlockCopy(saltBytes, 0, concat, 0, saltBytes.Length);
        System.Buffer.BlockCopy(plainHash, 0, concat, saltBytes.Length, plainHash.Length);

        byte[] tHashBytes = hash.ComputeHash(concat);

        // Convert result into a base64-encoded string.
        string hashValue = Convert.ToBase64String(tHashBytes);

        // Return the result.
        return hashValue;
    }
4

6 に答える 6

11

C#はbase64でエンコードされた文字列を出力し、PHPは16進数の数値を出力しています。より良い比較は、PHPのハッシュ関数の最後にパラメーターtrueを渡し、結果をbase64に渡すことです。

 $hash = base64_encode(
           hash('sha256', $userData['salt'] . hash('sha256', $password), true )
         );
于 2011-08-30T21:30:25.107 に答える
3

彼らは違うからです。C#コードは、計算されたハッシュを最後にBase64エンコーディングでエンコードします。PHPは、16進数の文字列を返すだけです。

于 2011-08-30T21:29:21.937 に答える
2

最初の容疑者:

Encoding.UTF8.GetBytes(plainText);

C#はUTF-8を使用しますが、PHPはおそらく使用しませんが、US-ASCIIサブセットからの文字を厳密に使用すると幸運になる可能性があります。

2番目の容疑者:

Convert.ToBase64String(tHashBytes);

PHPのBase64については何もありません。

PHPは16進数でエンコードされた結果を提供するため、C#でも16進数に切り替える必要があります。解決策については、この回答を参照してください。

于 2011-08-30T21:31:23.467 に答える
0

私はC#プログラマーではありませんが、私に飛びついたのは次のとおりです。

// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(tHashBytes);

最終出力をC#でbase64エンコードしていますか?PHPを使用していないため...

于 2011-08-30T21:30:49.233 に答える
-1
C#
string toHash = "abcdefg";
SHA256Managed hash = new SHA256Managed();
byte[] signatureData = hash.ComputeHash(new UnicodeEncoding().GetBytes(toHash));
string hashResult = System.Convert.ToBase64String(signatureData);
PHP
print base64_encode(hash("sha256",mb_convert_encoding("abcdefg","UTF-16LE"),true));

トップコードのように書く、彼らは同じです

于 2013-03-01T09:43:27.867 に答える
-1

C#

string toHash = "abcdefg"; 
SHA256Managed hash = new SHA256Managed(); 
byte[] signatureData = hash.ComputeHash(new UnicodeEncoding().GetBytes(toHash)); 
string hashResult = System.Convert.ToBase64String(signatureData); 

PHP

print base64_encode(hash("sha256",mb_convert_encoding("abcdefg","UTF-16LE"),true));

私のために働きます。

于 2020-02-16T13:56:55.920 に答える