登录
首页 >  Golang >  Go问答

用Node.js编写go lang hmac的转换

来源:stackoverflow

时间:2024-02-09 09:03:24 443浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《用Node.js编写go lang hmac的转换》,聊聊,我们一起来看看吧!

问题内容

我尝试将一个go hmac用例转换为nodejs,对于普通的hmac我知道如何将其转换为nodejs。但我有下面的代码。

注意:go hmac.new 第一个参数是自定义哈希值,即 hmac。但我在nodejs版本中没有找到任何替代方案。

nodejs [createhmac][1]仅支持字符串哈希算法,不支持自定义哈希算法。有谁知道如何在nodejs中实现相同的功能?

package main

import (
    "crypto/hmac"
    "crypto/sha256"
    "encoding/hex"
    "fmt"
    "hash"
)
func main() {
    hmacf := hmac.New(func() hash.Hash {
        return hmac.New(sha256.New, []byte("inner-key1"))
    }, []byte("inner-key2"));

    hmacf.Write([]byte("message"))
    fmt.Println(hex.EncodeToString(hmacf.Sum(nil)))
}

| [1]:https://nodejs.org/api/crypto.html#cryptocreatehmacalgorithm-key-options


正确答案


hmac by definition 在内部使用摘要而不是 hmac。因此,go 实现实际上是 hmac 定义的泛化,大多数库不支持这一点并不奇怪,就像 nodejs 不支持开箱即用一样。
但由于hmac的定义比较简单,所以很容易实现所需的功能。

以下是使用加密库的递归实现:

const crypto = require('crypto')

function hmac_rec(data, keylist) {
    const digest = 'sha256', blocksizeofdigest = 64
    var key = keylist.pop()
    if (keylist.length > 0) {
        // adjust key (according to hmac specification)
        if (key.length > blocksizeofdigest) {k = buffer.allocunsafe(blocksizeofdigest).fill('\x00'); hmac_rec(key, [...keylist]).copy(k)}
        else if (key.length < blocksizeofdigest) {k = buffer.allocunsafe(blocksizeofdigest).fill('\x00'); key.copy(k)} 
        else k = key
        // create 'key xor ipad' and 'key xor opad' (according to hmac specification)  
        var ik = buffer.allocunsafe(blocksizeofdigest), ok = buffer.allocunsafe(blocksizeofdigest)
        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(hmac)
        var innerhmac = hmac_rec(buffer.concat([ ik, data ]), [...keylist]) 
        var hmac = hmac_rec(buffer.concat([ ok, innerhmac ]), [...keylist])
    } else {
        // calculate regular hmac(hash)
        var hmac = crypto.createhmac(digest, key).update(data).digest();
    }
    return hmac 
}

测试:

var keyList = [ Buffer.from('inner-key1'), Buffer.from('inner-key2') ]
var data = Buffer.from('message', 'utf8')
var result = hmac_rec(data, keyList)
console.log(result.toString('hex')) // 48d2fcee3d16024d053db80f3e7140b853159f69d15a66d4cd6fad907b44e0cf

根据发布的go代码的结果。

以上就是《用Node.js编写go lang hmac的转换》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>