文字列からSHA-1ハッシュを計算しようとしていますが、phpのsha1関数を使用して文字列を計算すると、C#で試した場合とは異なる結果が得られます。 PHPと同じ文字列を計算するにはC#が必要です(phpからの文字列は変更できないサードパーティによって計算されるため)C#でPHPと同じハッシュを生成するにはどうすればよいですか?ありがとう!!!
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();
UnicodeEncodingの代わりにASCIIEncodingを使用します。 PHPはハッシュ計算にASCII文字セットを使用します。
.NETのこのメソッドは、phpのsha1と同等です。
string sha1Hash(string password)
{
return string.Join("", SHA1CryptoServiceProvider.Create().ComputeHash(Encoding.UTF8.GetBytes(password)).Select(x => x.ToString("x2")));
}
私もこの問題を抱えていました。次のコードが機能します。
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();
同じ問題がありました。このコードは私のために働いた:
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();
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()));
}