カテゴリー
Nodejs/Crypto APIを使って簡単な認証機能付きWEBページを構築する
※ 当ページには【広告/PR】を含む場合があります。
2024/10/28
Node.js Cryptoを使った暗号操作
ハッシュ化
import { createHash } from 'node:crypto';
const txt = 'hogehoge';
const hashedText = createHash('sha256').update(txt).digest('base64');
//👇Base64形式のハッシュ値が表示される
console.log(hashedText);
const secret_key = 'とっても秘密';
const hashedText = createHash('sha256').update(`絶対バレたくない鍵は${secret_key}`).digest('base64');
import { createHmac } from 'node:crypto';
const secret_key = 'とっても秘密';
const hashedText = createHmac('sha256', secret_key).update(`絶対バレたくない言葉`).digest('base64');
暗号化
import { randomBytes, createCipheriv, scryptSync } from 'node:crypto';
//☆👇暗号化するアルゴリズム
const algorithm = "aes-256-ctr";
//☆👇秘密鍵となるパスワード
const secretKey = process.env.SERVER_SECRET_KEY;
const encrypt = (txt: string): Buffer => {
//☆👇サルト
const salt = randomBytes(16);
const key = scryptSync(secretKey, salt, 32);
//☆👇IV(初期化ベクトル)
const iv = randomBytes(16);
const cipher = createCipheriv(algorithm, key, iv);
const encrypted = Buffer.concat([salt, iv, cipher.update(txt, "utf8"), cipher.final()]);
return encrypted;
};
ソルト
IV
ソルト(でハッシュ化したパスワード)
IV
createCipheriv
Cipheriv
Cipheriv
update
update
update
第一引数:
暗号化の対象となる文字列
第二引数:
入力エンコード。
=> utf8/ascii/binary から選択
第三引数:
出力エンコード。
=> binary/base64/hex
update
final
ソルト
IV(初期化ベクトル)
復号化
import { createDecipheriv, scryptSync } from 'node:crypto';
//☆👇暗号化するアルゴリズム
const algorithm = "aes-256-ctr";
//☆👇秘密鍵となるパスワード
const secretKey = process.env.SERVER_SECRET_KEY;
const decrypt = (ciphertext: Buffer, salt: Buffer, iv: Buffer) => {
const key = scryptSync(secretKey, salt, 32);
//👇createDecipheriv関数では暗号化したときに利用した暗号化アルゴリズム、鍵、IVを指定
const decipher = createDecipheriv(algorithm, key, iv);
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
return decrypted.toString("utf8");
};
update
final
encrypt
//👇クライアントから送信されてきた文字列(ここではBase64形式と想定)
const et: string = '暗号化されたメッセージ';
//👇Base64をBufferへ変換
const ret = Buffer.from(et, 'base64');
//👇Bufferの先頭1〜16Bytes目がサルト
const salt = ret.subarray(0, 16);
//👇Bufferの17〜32Bytes目がIV
const iv = ret.subarray(16, 32);
//👇Bufferの33Bytes目以降から暗号化したデータ
const val = ret.subarray(32);
//👇データをUTF-8で復号化したものを得る
const decripted = decrypt(val, salt, iv);
Bufferの使い方
new Buffer()
const _buf = new Buffer('HOGE!');
Buffer.from
Buffer.alloc
Buffer.allocUnsafe
///size(バイト数)指定
new Buffer(size)
//👇
Buffer.alloc(size)
//もしくはBuffer.allocUnsafe(...)
///size以外のString・Array・ArrayBuffer・Buffer型
new Buffer(string)
//👇
Buffer.from(string)
まとめ
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー