Функция nacl.hash в TweetNaCl.js реализует
криптографическую хеш-функцию SHA-512 и предназначена для получения
фиксированной 64-байтной (512-битной) контрольной суммы произвольных
данных.
Ключевые характеристики:
Функция не является шифрованием — это одностороннее преобразование данных.
nacl.hash принимает данные в виде:
Uint8ArrayЛюбые строки предварительно кодируются в байты (например, UTF-8).
Результат:
Uint8Array(64) — 512-битный хеш SHA-512import nacl from "tweetnacl";
// преобразование строки в байты
function encodeUTF8(str) {
return new TextEncoder().encode(str);
}
const message = encodeUTF8("cryptographic hash");
const hash = nacl.hash(message);
console.log(hash);
Результат — массив из 64 чисел (0–255), представляющий SHA-512 хеш.
Чаще всего хеш преобразуют в hex-строку для хранения или сравнения.
function toHex(bytes) {
return Array.from(bytes)
.map(b => b.toString(16).padStart(2, "0"))
.join("");
}
const message = new TextEncoder().encode("data");
const hash = nacl.hash(message);
console.log(toHex(hash));
const msg = new TextEncoder().encode("test");
const h1 = nacl.hash(msg);
const h2 = nacl.hash(msg);
console.log(h1.every((v, i) => v === h2[i])); // true
Лавинный эффект проявляется даже при минимальном изменении:
const a = new TextEncoder().encode("block");
const b = new TextEncoder().encode("blocks");
const h1 = nacl.hash(a);
const h2 = nacl.hash(b);
console.log(h1);
console.log(h2);
Хеши будут полностью различаться без частичного совпадения структуры.
В TweetNaCl.js присутствуют разные криптографические примитивы:
| Функция | Назначение |
|---|---|
nacl.hash |
SHA-512 хеширование |
nacl.secretbox |
симметричное шифрование |
nacl.box |
асимметричное шифрование |
nacl.sign |
цифровая подпись |
nacl.hash не использует ключи и не предназначен для
шифрования данных.
const data = new TextEncoder().encode("important file");
const checksum = nacl.hash(data);
Хеш сохраняется отдельно и позже используется для проверки, не изменились ли данные.
const password = new TextEncoder().encode("my_password");
const digest = nacl.hash(password);
Важно учитывать, что SHA-512 без соли и растяжения не подходит для безопасного хранения паролей в продакшене. Он может использоваться только как базовый строительный блок.
function objectHash(obj) {
const json = JSON.stringify(obj);
return nacl.hash(new TextEncoder().encode(json));
}
Позволяет получать стабильный идентификатор структуры данных.
TweetNaCl.js реализует SHA-512 без зависимостей и опирается на
строгую типизацию через Uint8Array.
Основные особенности:
Это делает реализацию компактной, но не предназначенной для хеширования потоков данных в реальном времени.
update() /
final())nacl.hash("text"); // некорректно
Правильно:
nacl.hash(new TextEncoder().encode("text"));
nacl.hash не принимает ключи и не может использоваться
как HMAC.
===h1 === h2 // всегда false
Необходимо сравнивать байты:
h1.every((v, i) => v === h2[i]);
В прикладных системах nacl.hash часто используется как
низкоуровневый строительный блок:
TweetNaCl.js следует концепции NaCl (Networking and Cryptography library), где каждый примитив имеет строго ограниченную и предсказуемую роль.
nacl.hash в этой модели выполняет функцию:
const hash = nacl.hash(data);
toHex(hash);
function toBase64(bytes) {
let binary = "";
for (let b of bytes) binary += String.fromCharCode(b);
return btoa(binary);
}
Любая структура данных должна быть приведена к байтовому виду:
В криптографических протоколах nacl.hash часто выступает
как:
Он не используется изолированно для защиты данных, а встроен в более сложные конструкции безопасности.