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ハッシュを取得し、値0xb3 0x7a 0x4f 0x2c 0xc0 0x62 0x4f 0x16 0x90 0xf6 0x46 0x06 0xcf 0x38 0x59 0x45 0xb2 0xbe 0xc4 0xeaを提供します。次に、この値はbase64でエンコードされ、"s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
ヘッダーに返される"Sec-WebSocket-Accept"
の値を提供します。
crypto.createHash()
function および関連する hash.update()
および hash.digest()
関数を参照してください。
const crypto = require('crypto')
, shasum = crypto.createHash('sha1');
shasum.update('foo');
console.log(shasum.digest('hex'));
// "0beec7b5ea3f0fdbc95d0dd47f3c5bc275da8a33"
必須:SHA1は壊れています、平均的なスタートアップアクセラレータコホートのAWSクレジットと衝突することができますが、質問に答えるには:
var getSHA1ofJSON = function(input){
return crypto.createHash('sha1').update(JSON.stringify(input)).digest('hex')
}
次に:
getSHA1ofJSON('whatever')
または
getSHA1ofJSON(['whatever'])
または
getSHA1ofJSON({'this':'too'})
あなたの投稿のコメントで私のアドバイスを読んで強く考慮してください。そうは言っても、まだこれを行う正当な理由がある場合は、Nodeのcrpytoモジュールの this Listing をチェックしてください。 sha1とbase64の両方を処理するためのモジュールがあります。
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 ;)");
試すことができます:「\ xac」、「\ xd1」、「\ xb9」、「\ xe2」、「\ xbb」、「\ x93」など...
sha1("\xac") //39527c59247a39d18ad48b9947ea738396a3bc47
sha1 = crypto.createHash("sha1").update("\xac", "binary").digest("hex") //39527c59247a39d18ad48b9947ea738396a3bc47
//without:
sha1 = crypto.createHash("sha1").update("\xac").digest("hex") //f50eb35d94f1d75480496e54f4b4a472a9148752