如何在 node.js 中获得字符串的 sha1散列?

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

要使服务器工作,我需要获取字符串的 SHA1散列。

我要做的是在 第5.2.2节,文件第35页中解释。

注意: 作为一个例子,如果 "Sec-WebSocket-Key"的值 在客户端的握手头是 "dGhlIHNhbXBsZSBub25jZQ==",服务器将追加字符串 "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"形成 字符串 "dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"。然后,服务器将获取该字符串的 SHA-1散列,给出值0xb30x7a 0x4f 0x2c 0xc00x620x4f 0x160x900xf60x460x060xcf 0x380x590x450xb20xbe 0xc40xea。然后对该值进行 base64编码,以给出将返回的值 "s3pPLMBiTxaQ9kYGzzhZRbK+xOo=""Sec-WebSocket-Accept"头中。

161640 次浏览

参见 crypto.createHash()功能及相关的 hash.update()hash.digest()函数:

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

请阅读并认真考虑我的建议在您的帖子的评论。也就是说,如果你仍然有一个很好的理由这样做,检查 Node 的加密模块列表。它有处理 sha1和 base64的模块。

必须的: SHA1坏了 ,你可以使用 以45,000美元计算 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...)正在散列字节串。

我们可以添加 二进制参数来使用字节字符串。

const crypto = require("crypto");


function sha1(data) {
return crypto.createHash("sha1").update(data, "binary").digest("hex");
}


sha1("Your text ;)");

您可以尝试使用: “ xac”、“ xd1”、“ xb9”、“ xe2”、“ xbb”、“ x93”等等。

其他语言(Python,PHP,...) :

sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47

野田佳彦:

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

使用与新浏览器兼容的、零依赖的 SubtleCrypto API 在 Node v15中添加

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

资料来源: