首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CryptoJS加密HMACSha256不同于Java

CryptoJS加密HMACSha256不同于Java
EN

Stack Overflow用户
提问于 2019-11-08 04:40:10
回答 1查看 1.3K关注 0票数 1

我正在尝试将CryptoJS的以下代码转换为Kotlin:

代码语言:javascript
复制
const hash = CryptoJS.HmacSHA256(message, key); 
const signature = CryptoJS.enc.Hex.stringify(hash);

这是与上面的代码片段等效的kotlin代码:

代码语言:javascript
复制
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代码生成不同结果的测试。

输入:

代码语言:javascript
复制
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代码的结果:

代码语言:javascript
复制
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代码的结果:

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

发布于 2019-11-08 05:48:12

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

因此,我假设您可以通过使用WordArray上的函数来简单地修复此问题,例如hash.toString('hex')

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58756605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档