web-dev-qa-db-ja.com

C#SHA1 vs. PHP SHA1 ...異なる結果?

文字列からSHA-1ハッシュを計算しようとしていますが、phpのsha1関数を使用して文字列を計算すると、C#で試した場合とは異なる結果が得られます。 PHPと同じ文字列を計算するにはC#が必要です(phpからの文字列は変更できないサードパーティによって計算されるため)C#でPHPと同じハッシュを生成するにはどうすればよいですか?ありがとう!!!

文字列[email protected]

C#コード(d32954053ee93985f5c3ca2583145668bb7ade86を生成します)

        string encode = secretkey + email;
        UnicodeEncoding UE = new UnicodeEncoding();
        byte[] HashValue, MessageBytes = UE.GetBytes(encode);
        SHA1Managed SHhash = new SHA1Managed();
        string strHex = "";

        HashValue = SHhash.ComputeHash(MessageBytes);
        foreach(byte b in HashValue) {
            strHex += String.Format("{0:x2}", b);
        }

PHPコード(a9410edeaf75222d7b576c1b23ca0a9af0dffa98を生成します)

sha1();
35
Anand Capur

UnicodeEncodingの代わりにASCIIEncodingを使用します。 PHPはハッシュ計算にASCII文字セットを使用します。

36
Andrew Moore

.NETのこのメソッドは、phpのsha1と同等です。

string sha1Hash(string password)
{
    return string.Join("", SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.UTF8.GetBytes(password)).Select(x => x.ToString("x2")));
}
8
OmarElsherif

私もこの問題を抱えていました。次のコードが機能します。

string dataString = "string to hash";
SHA1 hash = SHA1CryptoServiceProvider.Create();
byte[] plainTextBytes = Encoding.ASCII.GetBytes(dataString);
byte[] hashBytes = hash.ComputeHash(plainTextBytes);
string localChecksum = BitConverter.ToString(hashBytes)
.Replace("-", "").ToLowerInvariant();
5
Paul Johnson

同じ問題がありました。このコードは私のために働いた:

string encode = secretkey + email;
SHA1 sha1 = SHA1CryptoServiceProvider.Create();
byte[] encodeBytes = Encoding.ASCII.GetBytes(encode);
byte[] encodeHashedBytes = sha1.ComputeHash(passwordBytes);
string pencodeHashed = BitConverter.
ToString(encode HashedBytes).Replace("-", "").ToLowerInvariant();
2
nicojs

FWIW、Javaでも同様の問題が発生しました。 sha1関数がJavaで生成するのと同じSHA1ハッシュをPHP = 5.3.1(XAMPP Vistaで実行)。

    private static String SHA1(final String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        final MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(text.getBytes("UTF-8"));
        return new String(org.Apache.commons.codec.binary.Hex.encodeHex(md.digest()));
    }
1
Gunnar