hmac.New(h func() hash.Hash, key byte) hash.Hash 在 JavaScript 中等效
在PHP中,我们经常需要使用加密算法来保护数据的安全性。HMAC(Hash-based Message Authentication Code)是一种常用的加密算法,用于验证数据完整性和身份认证。在PHP中,我们可以使用hmac.New()函数来创建HMAC实例,该函数需要指定一个哈希函数和一个密钥。与此类似,在JavaScript中,我们可以使用等效的方法来实现相同的功能。在本文中,我将为您介绍如何在JavaScript中使用等效的方法来创建HMAC实例,以及如何在PHP和JavaScript之间进行数据的加密和解密。
问题内容
差点在go lang hmac.new的js实现中卡住好几天了。然而,没有成功。我使用 crypto
、crypto-js
和 stablelib
模块进行实现。问题是,在go lang版本中,hmac
实例可以通过hmac
实例创建。例如(代码块正确且经过测试):
hmacf := hmac.New(func() hash.Hash { return hmac.New(func() hash.Hash { return hmac.New(func() hash.Hash { return hmac.New(sha256.New, []byte(SALT)) }, []byte(path[0])) }, []byte(path[1])) }, []byte(path[2]))
其实我也不知道它是怎么工作的!因为在所有与 javascript 相关的模块中,您无法从 hmac
创建 hmac
,并且它们接受确定哈希算法的 string
值。
也许最好问一下如何在javascript中从hmac
创建hmac
。
解决方案是什么?
当 go 版本的输出与你的实现的输出相同时;您的解决方案是正确的。
解决方法
根据规范 (rfc 2104),hmac 使用摘要函数内部,例如sha256。
但是,您的实现应用了(实际上不兼容)内部使用另一个 hmac 而不是摘要的 hmac,其中只有最低级别的 hmac 在内部使用常规摘要。这样就创建了一个嵌套结构。
基于常规 hmac(带有摘要)的规范,这可以扩展到 go 代码中使用的带有 hmac(而不是摘要)的 hmac:
hmac(k xor opad, hmac(k xor ipad, text))
s。 rfc2104,第 2 节。hmac 的定义
由于与规范的差异,找到一个开箱即用的支持此类功能的 javascript 库可能不会那么容易。
虽然大多数库当然支持 hmac,但只允许指定摘要(而不是 hmac),例如nodejs的crypto模块的crypto.createhmac()
,参见还有其他答案。我认为这种方法不能用于实现 go 代码中的逻辑。
如果其他答案的方法不起作用,并且您找不到另一个具有所需功能的 javascript 库,您可以自己在 javascript 中实现逻辑,因为 hmac 的规范相对简单(见上文) )。
以下代码是 nodejs 的 crypto 模块的示例实现:
var crypto = require('crypto') const digest = 'sha256' const blocksize = 64 // block size of the digest // define input parameter var salt = buffer.from('salt') var path = [ buffer.from('alfa'), buffer.from('beta'), buffer.from('gamma') ] var data = buffer.from('data') // calculate hmac var hmac = hmac(data, salt, path) console.log(hmac.tostring('hex')) function hmac(data, salt, path) { // create keylist var keylist = [] keylist.push(salt) keylist = keylist.concat(path) // determine hmac recursively var result = hmac_rec(data, keylist) return result } function hmac_rec(data, keylist) { // adjust key (according to hmac specification) var key = keylist.pop() if (key.length > blocksize) { k = buffer.allocunsafe(blocksize).fill('\x00'); if (keylist.length > 0) { hmac_rec(key, [...keylist]).copy(k) } else { gethash(key).copy(k) } } else if (key.length < blocksize) { k = buffer.allocunsafe(blocksize).fill('\x00'); key.copy(k) } else { k = key } // create 'key xor ipad' and 'key xor opad' (according to hmac specification) var ik = buffer.allocunsafe(blocksize) var ok = buffer.allocunsafe(blocksize) k.copy(ik) k.copy(ok) for (var i = 0; i < ik.length; i++) { ik[i] = 0x36 ^ ik[i] ok[i] = 0x5c ^ ok[i] } // calculate hmac if (keylist.length > 0) { var innerhmac = hmac_rec(buffer.concat([ ik, data ]), [...keylist]) var outerhmac = hmac_rec(buffer.concat([ ok, innerhmac ]), [...keylist]) } else { var innerhmac = gethash(buffer.concat([ik, data])) var outerhmac = gethash(buffer.concat([ok, innerhmac])) } return outerhmac } // calculate sha256 hash function gethash(data){ var hash = crypto.createhash(digest); hash.update(data) return hash.digest() }
结果:
2e631dcb4289f8256861a833ed985fa945cd714ebe7c3bd4ed4b4072b107b073
测试:
以下 go 代码产生相同的结果:
package main import ( "crypto/hmac" "crypto/sha256" "encoding/hex" "fmt" "hash" ) func main() { salt := "salt" path := []string{"alfa", "beta", "gamma"} hmacf := hmac.new(func() hash.hash { return hmac.new(func() hash.hash { return hmac.new(func() hash.hash { return hmac.new(sha256.new, []byte(salt)) }, []byte(path[0])) }, []byte(path[1])) }, []byte(path[2])) hmacf.write([]byte("data")) result := hmacf.sum(nil) fmt.println(hex.encodetostring(result)) // 2e631dcb4289f8256861a833ed985fa945cd714ebe7c3bd4ed4b4072b107b073 }
编辑:
受这篇文章的启发,以下是 hmac_rec()
的更紧凑/高效的实现,它使用常规最后一个迭代步骤的 hmac(这也使得 gethash()
过时):
function hmac_rec(data, keyList) { var key = keyList.pop() if (keyList.length > 0) { // adjust key (according to HMAC specification) if (key.length > blockSize) { k = Buffer.allocUnsafe(blockSize).fill('\x00'); hmac_rec(key, [...keyList]).copy(k) } else if (key.length < blockSize) { k = Buffer.allocUnsafe(blockSize).fill('\x00'); key.copy(k) } else { k = key } // create 'key xor ipad' and 'key xor opad' (according to HMAC specification) var ik = Buffer.allocUnsafe(blockSize) var ok = Buffer.allocUnsafe(blockSize) k.copy(ik) k.copy(ok) for (var i = 0; i < ik.length; i++) { ik[i] = 0x36 ^ ik[i] ok[i] = 0x5c ^ ok[i] } // calculate HMAC var innerHMac = hmac_rec(Buffer.concat([ ik, data ]), [...keyList]) var outerHMac = hmac_rec(Buffer.concat([ ok, innerHMac ]), [...keyList]) } else { var outerHMac = crypto.createHmac(digest, key).update(data).digest(); } return outerHMac }
以上是hmac.New(h func() hash.Hash, key byte) hash.Hash 在 JavaScript 中等效的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

热门话题

自 2009 年问世以来,比特币成为加密货币界的领头羊,其价格经历了巨大的波动。为了提供全面的历史概述,本文汇集了从 2009 年到 2025 年的比特币价格数据,涵盖了重大的市场事件、市场情绪变化和影响价格走势的重要因素。

比特币,作为一种加密货币,自问世以来经历了显着的市场波动。本文将提供比特币自诞生以来的历史价格总览,帮助读者了解其价格趋势和关键时刻。通过分析比特币的历史价格数据,我们可以了解市场对其价值评估、影响其波动的因素,并为未来投资决策提供依据。

比特币自 2009 年创世以来,价格经历多次大幅波动,最高涨至 2021 年 11 月的 69,044.77 美元,最低跌至 2018 年 12 月的 3,191.22 美元。截至 2024 年 12 月,最新价格突破 100,204 美元。

实时比特币美元价格 影响比特币价格的因素 预测比特币未来价格的指标 以下是 2018-2024 年比特币价格的一些关键信息:

CSS自定义resize符号的方法与背景色统一在日常开发中,我们经常会遇到需要自定义用户界面细节的情况,比如调...

是的,H5页面制作是前端开发的重要实现方式,涉及HTML、CSS和JavaScript等核心技术。开发者通过巧妙结合这些技术,例如使用<canvas>标签绘制图形或使用JavaScript控制交互行为,构建出动态且功能强大的H5页面。

如何实现分段器的45度曲线效果?在实现分段器的过程中,如何让点击左侧按钮时右侧边框变成45度曲线,而点�...
