在Python和JavaScript中生成SHA256哈希值会导致不同的结果

5
我是一个有用的助手,可以为您翻译文本。

我遇到了加密明文的问题。

在Python中,我正在做什么:

def encrypt(plaintext):
    import hashlib, base64

    hashed = hashlib.sha256(plaintext).digest()
    return base64.b64encode(hashed)

def main():
    input_value = "a"
    output = encrypt(plaintext=input_value)
    print output

if __name__ == "__main__":
    main()

Python中的结果:

ypeBEsobvcr6wjGzmiPcTaeG7/gUfE5yuYB3ha/uSLs=

我在JS中正在做什么:

var result = '';
var plaintext = 'a';

if(plaintext != null && plaintext != undefined) {
    var hashed = CryptoJS.SHA256(plaintext);
    result = hashed.toString(CryptoJS.Base64);
}

alert(result);

JS中的结果:

ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb

有人知道我做错了什么吗?

或者有没有一种方法可以在两种语言中获得相同的加密结果?

顺便说一下:对于我来说,更改Python代码会更容易,因为我已经在我的数据库中有CryptoJS加密后的值。


谢谢评论。那只是从我的代码中复制和粘贴错误。应该是“output = encrypt(plaintext=input_value)”。 - mr_5p4rk_
1个回答

6
CryptoJS通常不会抛出错误。你正在将“undefined”传递到“hashed.toString(CryptoJS.Base64);”中。请使用“CryptoJS.enc.Base64”,因为默认情况下使用“CryptoJS.enc.Hex”。
但是,由于你更喜欢改变Python,我建议以这种方式进行哈希处理:
def encrypt(plaintext):
    import hashlib, base64
    return hashlib.sha256(plaintext).hexdigest()

当CryptoJS更改默认行为时,您仍应将JavaScript代码更改为十六进制编码。


1
另外,既然他说他更喜欢更改Python代码,他可以使用.hexdigest()而不是进行base64编码。 - Reid
谢谢,回答后才注意到这个句子。 - Artjom B.
谢谢您的回答!那对我很有帮助!现在我需要想清楚是要修补我的数据库还是更改 Python 代码。您会推荐我做什么呢? - mr_5p4rk_
@gimlithedwarf 这个问题很难回答,因为有太多的可能性。如果你的空间有限,你可以将它转换成Base64格式,在这一列中节省约33%的空间。如果你将其作为URL参数发送,你应该将其保留为十六进制或者将其转换为Base64的URL安全版本(RFC 4648中的表2)。 - Artjom B.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接