Как посчитать хеш строки
Короткий ответ
В Node.js хеш считает createHash() из node:crypto. digest('hex') возвращает его шестнадцатеричной строкой:
import { createHash } from 'node:crypto';
const hash = createHash('sha256').update('hello').digest('hex');
console.log(hash);Результат:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824В браузере
В браузере и в современном Node.js работает crypto.subtle.digest(). Он возвращает байты, которые вы сами переводите в hex:
const sha256 = async (text) => {
const bytes = await crypto.subtle.digest('SHA-256', new TextEncoder().encode(text));
return [...new Uint8Array(bytes)].map((b) => b.toString(16).padStart(2, '0')).join('');
};
console.log(await sha256('hello'));Результат:
2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824Контрольная сумма файла
Хеш содержимого файла показывает, изменился ли файл:
import { createHash } from 'node:crypto';
import { readFile, writeFile } from 'node:fs/promises';
await writeFile('data.txt', 'version 1');
const checksum = createHash('md5').update(await readFile('data.txt')).digest('hex');
console.log(checksum.length);Результат:
32Частая ошибка
Не храните пароли простым хешем SHA-256 или MD5: их быстро подбирают перебором. Для паролей используйте специальные медленные функции, например scrypt из node:crypto или bcrypt.
import { randomBytes, scryptSync } from 'node:crypto';
const salt = randomBytes(16).toString('hex');
const hash = scryptSync('my password', salt, 64).toString('hex');
console.log(hash.length);Результат:
128Функции из этого ответа
- String.prototype.padStart — Дополняет строку слева до нужной длины.
- Number.prototype.toString — Превращает число в строку, в том числе в другой системе счисления.