如何在node.js中获取字符串的sha1哈希



我正在尝试创建一个用node.js 编写的websocket服务器

为了让服务器工作,我需要得到一个字符串的SHA1散列。

文件第35页第5.2.2节解释了我必须做的事情。

注:例如,如果"Sec-WebSocket-Key"的值客户端握手中的标头为"dGhlIHNhbXBsZSBub25jZQ==",服务器将附加该标头"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"以形成字符串CCD_ 4。然后,服务器将获取该字符串的SHA-1散列,给出值0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xea。然后对该值进行base64编码,得到值"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",该值将被返回在CCD_ 6报头中。

请参阅crypto.createHash()函数以及相关的hash.update()hash.digest()函数:

var crypto = require('crypto')
var shasum = crypto.createHash('sha1')
shasum.update('foo')
shasum.digest('hex') // => "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"

强制:SHA1已损坏,您可以计算45000美元的SHA1碰撞(自编写此答案以来甚至更低(。您应该使用sha256:

var getSHA256ofJSON = function(input){
    return crypto.createHash('sha256').update(JSON.stringify(input)).digest('hex')
}

要回答您的问题并制作SHA1哈希:

const INSECURE_ALGORITHM = 'sha1'
var getInsecureSHA1ofJSON = function(input){
    return crypto.createHash(INSECURE_ALGORITHM).update(JSON.stringify(input)).digest('hex')
}

然后:

getSHA256ofJSON('whatever')

getSHA256ofJSON(['whatever'])

getSHA256ofJSON({'this':'too'})

crypto.createHash() 上的官方节点文档

我体验到NodeJS正在散列字符串的UTF-8表示。其他语言(如Python、PHP或PERL…(正在对字节字符串进行哈希处理。

获得与Python/PHP相同哈希的提示,…:

我们可以添加二进制参数来使用字节字符串(这种编码将增加冲突的可能性,但将与其他语言兼容(。

const crypto = require('crypto')
function sha1(data) {
    return crypto.createHash('sha1').update(data, 'binary').digest('hex')
}
text = 'Your text and symbol xac'
console.log(text, ':', sha1(text))

您可以尝试使用:";\xac"\xd1"\xb9"\xe2"\xbb"\x93〃;,等等。

其他语言(Python、PHP…(:

sha1('xac') //39527c59247a39d18ad48b9947ea738396a3bc47

Nodejs:

sha1 = crypto.createHash('sha1').update('xac', 'binary').digest('hex') //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash('sha1').update('xac').digest('hex') //f50eb35d94f1d75480496e54f4b4a472a9148752

您可以使用:

  const sha1 = require('sha1');
  const crypt = sha1('Text');
  console.log(crypt);

用于安装:

  sudo npm install -g sha1
  npm install sha1 --save

请阅读并在您的帖子评论中强烈考虑我的建议。话虽如此,如果你仍然有充分的理由这样做,请查看Node的加密模块列表。它有用于处理sha1和base64的模块。

使用Node v15 中添加的新浏览器兼容、零依赖SubtleCrypto API进行回答

const crypto = this.crypto || require('crypto').webcrypto;
const sha1sum = async (message) => {
  const encoder = new TextEncoder()
  const data = encoder.encode(message)
  const hashBuffer = await crypto.subtle.digest('SHA-1', data)
  const hashArray = Array.from(new Uint8Array(hashBuffer));                     // convert buffer to byte array
  const hashHex = hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // convert bytes to hex string
  return hashHex;
}
sha1sum('foo')
  .then(digestHex => console.log(digestHex))
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"

节点沙盒:https://runkit.com/hesygolu/61564dbee2ec8600082a884d

来源:

  • https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest#converting_a_digest_to_a_hex_string
  • https://nodejs.org/api/webcrypto.html#webcrypto_class_subtlecrypto

相关内容

  • 没有找到相关文章

最新更新