RIPEMD-160 в SJCL реализован как часть набора криптографических
хеш-функций и доступен через пространство имён sjcl.hash.
Он используется реже, чем SHA-256, но остаётся важным в системах, где
требуется компактный 160-битный хеш с исторической совместимостью
(например, криптовалютные протоколы).
RIPEMD-160 становится доступным после подключения основной библиотеки Stanford JavaScript Crypto Library:
<script src="sjcl.js"></script>
В модульной среде (Node.js или bundler) возможен импорт:
import sjcl from "sjcl";
или
const sjcl = require("sjcl");
Важно учитывать, что не все сборки SJCL содержат полный набор хеш-функций. В минимизированных версиях некоторые алгоритмы могут быть исключены.
Хеш-функция реализована в пространстве имён:
sjcl.hash.ripemd160
Создание экземпляра:
const hash = new sjcl.hash.ripemd160();
После этого объект можно использовать для поэтапного (streaming) хеширования данных.
SJCL не работает напрямую со строками в хеш-функциях. Входные данные
должны быть преобразованы в bitArray.
Стандартный пример:
const data = "hello world";
// преобразование строки в bitArray
const bits = sjcl.codec.utf8String.toBits(data);
// создание хеша
const hash = new sjcl.hash.ripemd160();
hash.update(bits);
// получение результата
const result = hash.finalize();
Результат RIPEMD-160 — это bitArray, который обычно
преобразуется в hex:
const hex = sjcl.codec.hex.fromBits(result);
console.log(hex);
Выход будет 40-символьной шестнадцатеричной строкой (160 бит = 20 байт).
Для простых задач удобнее использовать финализацию без промежуточных обновлений:
const bits = sjcl.codec.utf8String.toBits("hello world");
const hash = sjcl.hash.ripemd160.hash(bits);
const hex = sjcl.codec.hex.fromBits(hash);
Метод hash() создаёт новый экземпляр и возвращает
итоговое значение.
RIPEMD-160 поддерживает потоковую обработку, что важно при работе с большими данными:
const h = new sjcl.hash.ripemd160();
h.update(sjcl.codec.utf8String.toBits("hello "));
h.update(sjcl.codec.utf8String.toBits("world"));
const digest = h.finalize();
console.log(sjcl.codec.hex.fromBits(digest));
Это поведение аналогично SHA-1/SHA-256 в SJCL.
RIPEMD-160 часто используется не только для текста, но и для бинарных буферов.
Если данные уже представлены в bitArray, преобразование
не требуется:
const bits = [0x12345678, 0x9abcdef0]; // пример bitArray
const hash = sjcl.hash.ripemd160.hash(bits);
SJCL использует собственный формат bitArray, поэтому при
взаимодействии с WebCrypto, Node.js Buffer или криптобиблиотеками
требуется конвертация:
Node.js Buffer → SJCL:
const buffer = Buffer.from("data");
const bits = sjcl.codec.hex.toBits(buffer.toString("hex"));
SJCL → Buffer:
const hex = sjcl.codec.hex.fromBits(digest);
const buffer = Buffer.from(hex, "hex");
RIPEMD-160 часто применяется в комбинации с SHA-256:
const data = sjcl.codec.utf8String.toBits("message");
// SHA-256
const sha256 = sjcl.hash.sha256.hash(data);
// RIPEMD-160 от результата SHA-256
const ripemd = sjcl.hash.ripemd160.hash(sha256);
console.log(sjcl.codec.hex.fromBits(ripemd));
Такая схема используется для уменьшения размера итогового хеша при сохранении криптографической стойкости.
RIPEMD-160 является ключевым элементом в формировании адресов Bitcoin:
В SJCL это выглядит как цепочка преобразований:
const pubKeyBits = sjcl.codec.hex.toBits(pubKeyHex);
const sha = sjcl.hash.sha256.hash(pubKeyBits);
const ripe = sjcl.hash.ripemd160.hash(sha);
const addressHash = sjcl.codec.hex.fromBits(ripe);
RIPEMD-160 в SJCL реализован на чистом JavaScript и опирается на:
bitArrayИз-за этого производительность ниже, чем у SHA-256 в браузерных API, но выше совместимость и контроль над процессом обработки данных.
RIPEMD-160 в SJCL имеет следующие особенности:
crypto.subtle.digestНеправильная передача строки напрямую:
sjcl.hash.ripemd160.hash("text"); // некорректно
Правильный вариант:
sjcl.hash.ripemd160.hash(sjcl.codec.utf8String.toBits("text"));
Использование неподходящего кодирования приводит к различиям в хешах
между системами. Чаще всего проблема возникает при смешивании UTF-8 и
ASCII без явного преобразования через
sjcl.codec.utf8String.