3

PHPのsha512ハッシュを取得し、C#内で一致させるコードを探して見つけました。私は現在、C#で作成されたハッシュから移動し、PHPで同じ結果を取得する方法を探しています。asp.netからPHPに徐々に移行しており、データベースでパスワードを確認する方法が必要です。ハッシュの作成に使用されるC#コードは次のとおりです。

// Create a hash from a pwd and salt using sha512
    public static string CreatePasswordHash(string _password, string _salt)
    {
        string saltAndPwd = String.Concat(_password, _salt);
        SHA512 sha512 = new System.Security.Cryptography.SHA512Managed();

        byte[] sha512Bytes = System.Text.Encoding.Default.GetBytes(saltAndPwd);

        byte[] cryString = sha512.ComputeHash(sha512Bytes);

        string hashedPwd = string.Empty;

        for (int i = 0; i < cryString.Length; i++)
        {
            hashedPwd += cryString[i].ToString("X");
        }

        return hashedPwd;
    }

PHPで私はそれを一致させようとしましたが、それはほんの数バイトずれているようです。

function CreatePasswordHash($_password, $_salt)
    {            
        $saltAndPwd = $_password . $_salt;            
        $hashedPwd = hash('sha512', $saltAndPwd);      
        return strtoupper($hashedPwd);
    }

上記を同じソルトとパスワードで使用すると、ここに結果が表示されます。最初の結果はC#からのもので、2番目の結果はPHPからのものです。

60BB73FDA3FF7A444870C6D0DBC7C6966F8D5AD632B0A02762E0283051D7C54A5F4B01571D1A5BC8C689DBC411FEB92158383A56AFC6AE6074696AF36E16    
60BB73FDA3FF7A444870C6D0DBC7C609066F8D5AD632B0A02762E0283051D7C54A5F4B001571D1A5BC8C689DBC411FEB092158383A56AFC6AE6074696AF36E16

これらが一致しない理由についてのアイデアはありますか?エンディアンのバイト順序と関係がありますか?

4

4 に答える 4

6

試す

hashedPwd += cryString[i].ToString("X2");

PHPの編集:

function CreatePasswordHash($_password, $_salt)
{
    $saltAndPwd = $_password . $_salt;
    $hashedPwd = hash('sha512', $saltAndPwd);

    $hex_strs = str_split($hashedPwd,2);

    foreach($hex_strs as &$hex) {
        $hex = preg_replace('/^0/', '', $hex);
    }
    $hashedPwd = implode('', $hex_strs);

    return strtoupper($hashedPwd);
}
于 2012-09-25T22:41:49.603 に答える
2

C#の印刷には、先行ゼロは含まれていません。

交換

hashedPwd += cryString[i].ToString("X");

hashedPwd += cryString[i].ToString("X2");
于 2012-09-25T22:41:53.947 に答える
1

C#とPHPで同じ文字エンコードを使用していることを再確認してください。GetBytesは、エンコーディングに応じて異なる結果を返します。System.Text.Encoding.Defaultは、OSのローカリゼーションによって異なります。

于 2012-09-25T22:45:43.213 に答える
0

open_ssl_digestを試すことができます

echo openssl_digest($saltAndPwd, 'sha512');

PHP>=5.3を使用している場合

また、 hash_algos関数を使用して、システムでサポートされているアルゴリズムを確認することもできます。

HTH

于 2012-09-25T22:36:45.637 に答える