TypeScript Crypto-JS如何使用SHA256算法和密钥对数据进行哈希处理

13

我正在使用typescript版本3.7.2使用crypto-js加密数据。

算法- sha256

但是我的代码生成了错误的哈希数据。

如果不使用任何密钥来哈希数据,则该代码运行良好。

CryptoJS.SHA256(message).toString(CryptoJS.enc.Hex)

但是当我使用密钥时,哈希处理出现错误。

以下是完整代码。希望你能帮忙解决。谢谢。


    import CryptoJS from 'crypto-js';

    let order_id = 'order_EFph1itQK4z1NQ',
    let payment_id = 'pay_EFph2XRs3vkaB8',

    let generated_signature = CryptoJS.SHA256(order_id + "|" + payment_id, secret).toString(CryptoJS.enc.Hex);
 // secret is some key
生成签名的值(我们这一端)。
1a45e3be48f64911d372bcccd9c4dbe7dca9dab716603e4e80c2e55f701bde7a

与之比较的哈希值(由支付网关发送)

e236e8fe62c54546b85dede32c432d4c73c27157840a8ba67cfc09270b53064a

在线网站https://www.freeformatter.com/hmac-generator.html#ad-output生成的哈希值。

e236e8fe62c54546b85dede32c432d4c73c27157840a8ba67cfc09270b53064a

例如,由在线网站生成并由支付网关发送的哈希值匹配,这意味着我们的代码存在问题。

谢谢

Translated and polished:

举个例子,如果由在线网站生成并通过支付网关发送的哈希值匹配,那么说明我们的代码有问题。

谢谢。

2个回答

9

您希望计算 SHA256 HMAC,但实际上您正在计算消息 order_id + "|" + payment_id 的 SHA256 哈希值。传递给 SHA256 函数的 secret 参数被忽略。

CryptoJS.SHA256 替换为 CryptoJS.HmacSHA256,您的代码将按预期工作。


它只是忽略第二个参数。在JS中,即使函数没有声明它们,也允许传递额外的参数。SHA256是一种仅接受1个参数(要哈希的消息)的算法。 - Tomasz
我不熟悉你正在使用的库。我注意到它本身没有提供类型声明,因此@types/crypto-js可能与库的最新版本不同步。 - Tomasz
官方文档没有提到任何哈希函数的第二个参数:https://cryptojs.gitbook.io/docs/#hashing - Tomasz
好的,我曾经看到一个例子,其中确实使用了SHA256的第二个参数,但我现在找不到它了。可能只是我的确认偏见。我不知道JS会简单地忽略附加参数(或者忘记了它)。无论如何,如果你找到这样的例子:直接使用HMAC! HMAC不仅仅是SHA-256。 - Maarten Bodewes
@Tomasz,我该如何解决你提到的问题?@types/crypto-js不同步。 - pratik jaiswal

2

试一试。

import * as CryptoJS from 'crypto-js'

    private _hash(data: string) {
        return CryptoJS.SHA256(CryptoJS.enc.Hex.parse(data)).toString(CryptoJS.enc.Hex);
    }

你的回答可以通过提供更多支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人能够确认你的回答是否正确。你可以在帮助中心找到关于如何撰写好回答的更多信息。 - Community

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