Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Как посчитать хеш строки

Короткий ответ

В 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 — Превращает число в строку, в том числе в другой системе счисления.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.