Node.js で TextEncoder や SHA512 を作る
- カテゴリ:
- JavaScript
- コメント数:
- Comments: 0
この記事のコードを書いたときに いくつかの機能が Node.js で動かなかったので調べて見たメモ
ハッシュ値作成
SHA256 や SHA512 などのハッシュ値作成ブラウザ JavaScript なら
async function sha512(str){
const u8a = new TextEncoder().encode(str)
return hex(await crypto.subtle.digest("SHA-512", u8a))
}
function hex(buffer) {
let result = ""
const view = new DataView(buffer);
for (let i = 0; i < view.byteLength; i += 4) {
result += view.getUint32(i).toString(16).padStart(6, "0")
}
return result
}
const u8a = new TextEncoder().encode(str)
return hex(await crypto.subtle.digest("SHA-512", u8a))
}
function hex(buffer) {
let result = ""
const view = new DataView(buffer);
for (let i = 0; i < view.byteLength; i += 4) {
result += view.getUint32(i).toString(16).padStart(6, "0")
}
return result
}
という感じです
文字列を Uint8Array に変換して crypto.subtle.digest でハッシュ値を計算します
結果は ArrayBuffer なので 16 進数化します
Node.js だと crypto.subtle.digest 関数はないので crypto.createHash を使います
function sha512(str){
return crypto.createHash("SHA512").update(str).digest("hex")
}
return crypto.createHash("SHA512").update(str).digest("hex")
}
update メソッドに文字列を入れて digest メソッドで hex を指定すると 16 進数の文字列で結果が返ってきます
TextEncoder
ブラウザで文字列を Uin8Array 化する TextEncoder も Node.js にはありませんでもその変換自体は簡単です
function encodeText(str){
return new Uint8Array(new Buffer(str))
}
return new Uint8Array(new Buffer(str))
}
Buffer に入れるとバイト列になるので Uint8Array コンストラクタで Uint8Array 型にするだけ
atob/btoa
この 2 関数も用意されていませんNode.js ではこっちも Buffer を使います
function atob(str){
return new Buffer(str, "base64").toString("binary");
}
function btoa(str){
return new Buffer(str, "binary").toString("base64");
}
return new Buffer(str, "base64").toString("binary");
}
function btoa(str){
return new Buffer(str, "binary").toString("base64");
}
JavaScript の仕様でなく WebAPI の仕様である機能は Node.js になくて不便ですね
そのままコードが使えるように polyfill セットがあるといいけどあるのかな?
ひとつひとつは見つけましたがこういうのはセットであってほしいものです