【问题标题】:CryptoJS encrypt HMACSha256 different than JavaCryptoJS 加密 HMACSha256 与 Java 不同
【发布时间】: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


【解决方案1】:

没有 SHA-256 哈希只能有 8 个字节的位置。顾名思义,输出应该是 256 位或 32 字节。我怀疑会发生的是stringify 的输入已经被假定为字节,而 CryptoJS 函数返回一个 32 位字的WordArray。 8 * 32 = 256 这似乎是合理的。

所以我认为您可以通过使用 WordArray 上的函数来解决此问题,例如 hash.toString('hex')

【讨论】:

  • 您是否也建议修复变量名称?哈希!= hmac。
  • 我想你刚刚做到了:)。 HMAC 值是一个键控散列值,所以我觉得它并不重要。 tag 是另一种选择,或者只是 mac 等。
  • 我无法更改 Javascript 方式。我必须在 Kotlin 中做同样的事情
  • 你能告诉我JavaScript的输入输出字符串吗?
猜你喜欢
  • 1970-01-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多