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

vbopmzt1  于 2022-11-11  发布在  Node.js
关注(0)|答案(6)|浏览(146)

我正在尝试创建一个用node.js编写的WebSocket服务器
为了让服务器工作,我需要得到一个字符串的SHA1哈希值。
我必须做的事情在文档第35页的第5.2.2节中解释。
注意事项:例如,如果客户端握手中"Sec-WebSocket-Key"头的值为"dGhlIHNhbXBsZSBub25jZQ==",服务器将附加字符串"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"以形成字符串"dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11"。然后服务器将获取此字符串的SHA-1哈希值。给出值0xb 3 0x 7a 0x 4f 0x 2c 0xc 0 0x 62 0x 4f 0x 16 0x 90 0xf 6 0x 46 0x 06 0xcf 0x 38 0x 59 0x 45 0xb 2 0xbe 0xc 4 0xea.然后对该值进行base64编码,以给予值"s3pPLMBiTxaQ9kYGzzhZRbK+xOo=",其将在"Sec-WebSocket-Accept"报头中返回。

t9aqgxwy

t9aqgxwy1#

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

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

qzlgjiam2#

义务:SHA1坏了,你可以compute SHA1 collisions for 45,000 USD (and even less since this answer was written) .你应该使用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()上的正式节点文档

disbfnqx

disbfnqx3#

防止问题(错误哈希)的提示:

我体验到NodeJS是对字符串的UTF-8表示进行散列,而其他语言(如Python、PHP或PERL...)则是对字节字符串进行散列。
我们可以添加 binary 参数来使用字节字符串。

const crypto = require("crypto");

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

sha1("Your text ;)");

您可以尝试:“、”、“、”、“、”等等...“

其他语言(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
j7dteeu8

j7dteeu84#

您可以用途:

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

对于安装:

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

daolsyd05#

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

w8f9ii69

w8f9ii696#

使用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

相关问题