RIPEMD-160

RIPEMD-160 — криптографическая хеш-функция, разработанная в рамках проекта RIPE (RACE Integrity Primitives Evaluation Message Digest). Алгоритм формирует хеш длиной 160 бит (20 байт) и предназначен для обеспечения целостности данных и создания цифровых отпечатков.

Функция строится по принципу итеративного сжатия (Merkle–Damgård) и обрабатывает входные данные блоками по 512 бит. Отличительной особенностью является использование двух параллельных вычислительных ветвей, что повышает криптостойкость.

Ключевые свойства:

  • фиксированная длина выхода: 160 бит
  • устойчивость к коллизиям (на практике выше, чем у MD5, но ниже современных стандартов вроде SHA-256)
  • детерминированность
  • высокая чувствительность к изменениям входных данных (эффект лавины)

Подключение RIPEMD-160 в Crypto-js

Библиотека Crypto-js предоставляет реализацию RIPEMD-160 как отдельный модуль.

Установка через npm:

npm install crypto-js

Импорт:

const CryptoJS = require("crypto-js");
require("crypto-js/ripemd160");

В ES6:

import CryptoJS from "crypto-js";
import "crypto-js/ripemd160";

Базовое хеширование

Простейшее применение — вычисление хеша строки:

const hash = CryptoJS.RIPEMD160("Hello, world!");
console.log(hash.toString());

Результат:

98c615784ccb5fe5936fbc0cbe9dfdb408d92f0f

По умолчанию вывод происходит в hex-формате.


Работа с кодировками

Crypto-js использует внутренний формат WordArray. Для корректной обработки строк в различных кодировках применяются энкодеры.

UTF-8 (по умолчанию)

const hash = CryptoJS.RIPEMD160("Пример текста");

Явное указание кодировки:

const hash = CryptoJS.RIPEMD160(
  CryptoJS.enc.Utf8.parse("Пример текста")
);

Преобразование результата

Результат можно вывести в различных форматах:

HEX

hash.toString(CryptoJS.enc.Hex);

Base64

hash.toString(CryptoJS.enc.Base64);

Latin1

hash.toString(CryptoJS.enc.Latin1);

Хеширование бинарных данных

Для работы с бинарными данными необходимо создать WordArray.

Пример с массивом байтов:

const wordArray = CryptoJS.lib.WordArray.create([0x12345678, 0x90abcdef]);

const hash = CryptoJS.RIPEMD160(wordArray);
console.log(hash.toString());

Инкрементальное хеширование

Crypto-js поддерживает поэтапную обработку данных, что полезно при работе с большими потоками.

const ripemd160 = CryptoJS.algo.RIPEMD160.create();

ripemd160.update("Часть 1");
ripemd160.update("Часть 2");

const hash = ripemd160.finalize();
console.log(hash.toString());

Особенности:

  • метод update() можно вызывать многократно
  • finalize() завершает вычисление и возвращает результат
  • после finalize() объект не должен использоваться повторно

Использование в HMAC

RIPEMD-160 может применяться в HMAC (Hash-based Message Authentication Code).

const hmac = CryptoJS.HmacRIPEMD160("message", "secret-key");
console.log(hmac.toString());

Эквивалент через явный вызов:

const hmac = CryptoJS.algo.HMAC.create(
  CryptoJS.algo.RIPEMD160,
  "secret-key"
);

hmac.update("message");

const result = hmac.finalize();
console.log(result.toString());

Внутренний принцип работы

RIPEMD-160 использует:

  • 5 рабочих регистров (A, B, C, D, E)
  • 80 раундов преобразований
  • две параллельные цепочки вычислений (левая и правая)

Каждая итерация включает:

  • нелинейные функции
  • циклические сдвиги
  • добавление констант

После обработки блока результаты обеих ветвей объединяются.


Отличия от SHA-1

Несмотря на одинаковую длину хеша (160 бит), RIPEMD-160 отличается:

  • иная структура раундов
  • параллельные вычисления
  • разные нелинейные функции
  • независимая разработка

Практически:

  • SHA-1 считается устаревшим из-за коллизий
  • RIPEMD-160 также не рекомендуется для новых систем, но остаётся в использовании (например, в блокчейне Bitcoin)

Применение в криптографии

Типичные области использования:

  • создание цифровых отпечатков
  • проверка целостности данных
  • генерация адресов в криптовалютах
  • HMAC-аутентификация

Пример двойного хеширования (как в Bitcoin):

const sha256 = CryptoJS.SHA256("data");
const ripemd160 = CryptoJS.RIPEMD160(sha256);

console.log(ripemd160.toString());

Ограничения и безопасность

Несмотря на устойчивость, RIPEMD-160:

  • уступает современным алгоритмам (SHA-256, SHA-3)
  • не рекомендуется для новых криптографических систем
  • остаётся допустимым в legacy-сценариях

Рекомендации:

  • использовать для совместимости
  • избегать в новых протоколах безопасности
  • при необходимости применять более современные функции

Производительность

Crypto-js реализует RIPEMD-160 на чистом JavaScript, что означает:

  • хорошую переносимость
  • умеренную производительность
  • отсутствие аппаратного ускорения

Для высоконагруженных систем предпочтительнее нативные реализации (например, через Web Crypto API, где доступно).


Практические замечания

  • всегда явно контролировать кодировку входных данных
  • избегать повторного использования объекта после finalize()
  • при работе с большими данными использовать потоковый режим
  • учитывать длину хеша при хранении (40 символов в hex)

Сравнение с другими алгоритмами в Crypto-js

Алгоритм Длина хеша Устойчивость Рекомендация
MD5 128 бит низкая не использовать
SHA-1 160 бит скомпрометирован избегать
RIPEMD-160 160 бит средняя ограниченно
SHA-256 256 бит высокая рекомендуется

Итоговая структура использования

  1. Подключение модуля
  2. Подготовка входных данных
  3. Вызов CryptoJS.RIPEMD160
  4. Преобразование результата в нужный формат

Такой подход обеспечивает гибкость и совместимость при работе с криптографическими хешами в JavaScript.