Node.js & Node-Cryptoで簡単SHA-256ハッシュ化!同期・非同期処理徹底解説
Node.jsとNode-Cryptoを使ったSHA-256ハッシュの生成方法
ここでは、Node.jsとNode-Cryptoを用いてSHA-256ハッシュを生成する方法について、2つのパターンに分けて詳しく解説します。
パターン1: 同期処理によるハッシュ生成
このパターンは、比較的小さなサイズのデータに対して効率的に処理を行うことができます。
const crypto = require('crypto');
function generateSHA256Sync(data) {
const hash = crypto.createHash('sha256');
hash.update(data);
const digest = hash.digest('hex');
return digest;
}
const originalData = 'Hello, World!';
const hash = generateSHA256Sync(originalData);
console.log(`SHA-256 hash of "${originalData}": ${hash}`);
このコードは以下の処理を実行します。
crypto
モジュールの読み込みgenerateSHA256Sync
関数の定義- 引数としてハッシュ化したいデータを受け取る
crypto.createHash('sha256')
でSHA-256ハッシュオブジェクトを作成hash.update(data)
でハッシュ化するデータを追加hash.digest('hex')
でハッシュ値を16進数文字列として取得
generateSHA256Sync
関数を使用してサンプルデータのSHA-256ハッシュを生成- 生成されたハッシュ値をコンソールに出力
const crypto = require('crypto');
function generateSHA256Async(data) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('sha256');
hash.on('readable', () => {
const digest = hash.read();
if (digest) {
resolve(digest.toString('hex'));
}
});
hash.on('error', (error) => {
reject(error);
});
hash.write(data);
hash.end();
});
}
const originalData = 'This is a long piece of data to be hashed.';
generateSHA256Async(originalData).then(hash => {
console.log(`SHA-256 hash of "${originalData}": ${hash}`);
}).catch(error => {
console.error('Error generating hash:', error);
});
generateSHA256Async
関数の定義hash.on('readable')
イベントでハッシュ値が生成されたことを検知hash.read()
でハッシュ値を取得hash.on('error')
イベントでエラーが発生したことを検知hash.end()
で処理を終了
上記2つのパターンはいずれも、Node.jsとNode-Cryptoを用いてSHA-256ハッシュを簡単に生成する方法です。
用途に合わせて適切なパターンを選択することで、効率的なハッシュ処理を実現することができます。
const crypto = require('crypto');
function generateSHA256Sync(data) {
const hash = crypto.createHash('sha256');
hash.update(data);
const digest = hash.digest('hex');
return digest;
}
const originalData = 'Hello, World!';
const hash = generateSHA256Sync(originalData);
console.log(`SHA-256 hash of "${originalData}": ${hash}`);
const crypto = require('crypto');
function generateSHA256Async(data) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('sha256');
hash.on('readable', () => {
const digest = hash.read();
if (digest) {
resolve(digest.toString('hex'));
}
});
hash.on('error', (error) => {
reject(error);
});
hash.write(data);
hash.end();
});
}
const originalData = 'This is a long piece of data to be hashed.';
generateSHA256Async(originalData).then(hash => {
console.log(`SHA-256 hash of "${originalData}": ${hash}`);
}).catch(error => {
console.error('Error generating hash:', error);
});
ファイルからのハッシュ生成
const crypto = require('crypto');
const fs = require('fs');
function generateSHA256FromFile(filePath) {
return new Promise((resolve, reject) => {
const hash = crypto.createHash('sha256');
const stream = fs.createReadStream(filePath);
stream.on('data', (chunk) => {
hash.update(chunk);
});
stream.on('error', (error) => {
reject(error);
});
stream.on('end', () => {
const digest = hash.digest('hex');
resolve(digest);
});
});
}
const filePath = './example.txt';
generateSHA256FromFile(filePath).then(hash => {
console.log(`SHA-256 hash of "${filePath}": ${hash}`);
}).catch(error => {
console.error('Error generating hash:', error);
});
利点:
- ファイル全体を一度に読み込む必要がなく、メモリ効率に優れている。
- 大容量のファイルに対しても効率的に処理できる。
欠点:
- ストリーミング処理のため、コードが若干複雑になる。
ストリーミングハッシュ化
const crypto = require('crypto');
function generateSHA256Stream(dataStream) {
const hash = crypto.createHash('sha256');
dataStream.on('data', (chunk) => {
hash.update(chunk);
});
dataStream.on('end', () => {
const digest = hash.digest('hex');
console.log(`SHA-256 hash: ${digest}`);
});
}
const dataStream = fs.createReadStream('./example.txt');
generateSHA256Stream(dataStream);
- コードがシンプルで分かりやすい。
- ファイル全体を一度に読み込むため、メモリ使用量が多くなる可能性がある。
Web Crypto APIの使用
async function generateSHA256WebCrypto(data) {
const buffer = new TextEncoder().encode(data);
const hashBuffer = await crypto.subtle.digest('SHA-256', buffer);
const digest = Array.from(hashBuffer).map(b => b.toString(16)).join('');
return digest;
}
const originalData = 'Hello, World!';
const hash = await generateSHA256WebCrypto(originalData);
console.log(`SHA-256 hash of "${originalData}": ${hash}`);
- ブラウザ上で動作するWebアプリケーションにも利用可能。
- Node.js 8以前では利用不可。
- 他の方法と比べて処理速度が遅い場合がある。
上記以外にも、様々な方法でSHA-256ハッシュを生成することができます。
node.js node-crypto