[英]SHA1 C# result different from Python 3
我在C#上有以下代码:
public static string GenerateSecureHash(string data) {
HashAlgorithm algorithm = SHA1.Create();
byte[] hash = algorithm.ComputeHash(Encoding.UTF8.GetBytes(data));
StringBuilder sb = new StringBuilder();
foreach (byte b in hash)
sb.Append(b.ToString("x2"));
return sb.ToString();
}
给定一个data
字符串,它将生成一个SHA1字符串。 我尝试使用以下代码将其转换为Python3:
def GenerateSecureHash(data: str):
print('Generate Secure Hash called!')
enc = str.encode('utf-8') # encode in utf8
hash = sha1(enc)
formatted = hash.hexdigest()
return formatted
但是它们给出了不同的输出。
例如,如果我输入“ testStringHere”,则输出如下:
C#: 9ae24d80c345695120ff1cf9a474e36f15eb71c9
Python: 226cf119b78825f1720cf2ca485c2d85113d68c6
谁能指出我正确的方向? 谢谢。
问题在这里,
enc = str.encode('utf-8')
通过这样做,您实际上是使用默认编码'utf-8'对字符串“ utf-8 ”进行编码(而不是'“” testStringHere “字符串)。
>>> str.encode("utf-8")
b'utf-8'
请参阅str.encode
的文档
>>> help(str.encode)
Help on method_descriptor:
encode(self, /, encoding='utf-8', errors='strict')
Encode the string using the codec registered for encoding.
encoding
The encoding in which to encode the string.
errors
The error handling scheme to use for encoding errors.
The default is 'strict' meaning that encoding errors raise a
UnicodeEncodeError. Other possible values are 'ignore', 'replace' and
'xmlcharrefreplace' as well as any other name registered with
codecs.register_error that can handle UnicodeEncodeErrors.
您可以通过以下方式进行编码
enc = str.encode("testStringHere", 'utf-8') # encode in utf8
要么
enc = "testStringHere".encode('utf-8') # encode in utf8
演示:
>>> from hashlib import sha1
>>> enc = str.encode("testStringHere", 'utf-8')
>>> enc1 = "testStringHere".encode('utf-8')
>>> sha1(enc).hexdigest() == sha1(enc1).hexdigest()
True
我怀疑问题是您将字节转换回字符串的方式。
也许尝试这样的答案: https : //stackoverflow.com/a/1003289/813503
string result = System.Text.Encoding.UTF8.GetString(byteArray);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.