【发布时间】:2020-03-04 11:58:13
【问题描述】:
我正在尝试将此 CryptoJS 代码转换为 Kotlin:
const hash = CryptoJS.HmacSHA256(message, key);
const signature = CryptoJS.enc.Hex.stringify(hash);
这就是相当于上面sn-p的kotlin代码:
private fun generateSignature(key: String, payload: String): String {
val algorithm = "HmacSHA256"
return Mac.getInstance(algorithm)
.apply { init(SecretKeySpec(key.toByteArray(), algorithm)) }
.run { doFinal(payload.toByteArray()) }
.let { HexUtils.toHexString(it) }
}
但它根本不起作用。它们产生不同的结果。 CryptoJS 生成一个包含 8 个位置的字节数组,Java 代码生成一个包含 32 个位置的字节数组。
我不知道我做错了什么。我需要让我的 Kotlin 代码与 javascript 代码一样工作。
更新:我无法更改 Javascript 方式。我必须在 Kotlin 中做同样的事情
Update2:这是一个测试,其中 JS 代码和 Kotlin 代码产生不同的结果。
输入:
key = 's21fk4vb-5415-46c7-aade-303dcf432bb4'
message = 'POST,/wallets/3323461f96-bdf3-4e03-bc93-7da1fb27aee7/withdraw/,1573148023809,{"amount":"1.0","bank":{"bank":"789","agency":"456","account":"12378","accountDigit":"6","name":"joao","taxId":"33206913098","holderType":"personal"}}'
带有 JS 代码的结果:
Result of encrypt in bytes:
{sigBytes: 32, words: [8]}
sigBytes: 32
words: [8]
0: 2102759135
1: -196086391
2: -2099697915
3: -1620551271
4: 2463524
5: 1757965357
6: -1039993965
7: -1798822705
Bytes to Hex:
7d558edff44ff58982d927059f6859990025972468c86c2dc202f39394c824cf
Kotlin 代码的结果:
Result of encrypt in bytes:
{byte[32]@1126}
0 = 82
1 = -110
2 = -100
3 = -128
4 = -63
5 = 22
6 = -103
7 = -31
8 = 83
9 = -125
10 = -72
11 = 109
12 = -91
13 = -69
14 = 54
15 = -41
16 = 27
17 = -107
18 = -60
19 = -110
20 = -57
21 = -29
22 = -20
23 = -32
24 = -66
25 = 88
26 = 87
27 = -50
28 = -47
29 = -18
30 = -96
31 = 25
Bytes to Hex:
52929c80c11699e15383b86da5bb36d71b95c492c7e3ece0be5857ced1eea019
【问题讨论】:
-
我在 JSFiddle 中尝试了您的代码,结果得到“88cd2108b5347d973cf39cdf9053d7dd42704876d8c9a9bd8e2d168259d3ddf7”。你确定其他地方不存在这个问题吗?
-
嗨,js 代码和 kotlin 代码都可以。两者都生成签名。但如果我用相同的输入进行测试,它们会生成不同的签名
-
在 nodejs 12.9.1 cryptojs 3.1.9-1 上运行你的 JS 和数据 我得到了不同的结果 52929c80c11699e15383b86da5bb36d71b95c492c7e3ece0be5857ced1eea019 与你的 Kotlin 结果一致和来自 Java 和 OpenSSL 的结果。
标签: java kotlin encryption hmac cryptojs