SHA-256, SHA-384, SHA-512

Криптографические хэш-функции семейства SHA-2

SHA-2 представляет собой семейство криптографических хэш-функций, разработанных для формирования фиксированного по длине «отпечатка» данных произвольного размера. В контексте JavaScript-библиотеки Jsrsasign поддержка SHA-256, SHA-384 и SHA-512 реализована через модуль KJUR.crypto.MessageDigest.

Основные свойства SHA-2:

  • детерминированность: одинаковый вход всегда даёт одинаковый хэш
  • необратимость: восстановление исходных данных по хэшу вычислительно невозможно
  • лавинный эффект: малое изменение входа полностью меняет результат
  • устойчивость к коллизиям (на практике для современных атак считается безопасным)

SHA-256 использует 256-битный выход, SHA-384 — 384-битный, SHA-512 — 512-битный. Различие между ними заключается не только в длине результата, но и во внутренней длине блока и уровне производительности на разных архитектурах.


Библиотека Jsrsasign и модуль MessageDigest

В Jsrsasign криптографические хэш-функции реализованы через единый интерфейс:

KJUR.crypto.MessageDigest

Этот класс поддерживает несколько алгоритмов, включая SHA-256, SHA-384 и SHA-512.


SHA-256 в Jsrsasign

SHA-256 является наиболее часто используемым алгоритмом в веб-разработке, криптографических токенах и блокчейн-системах.

Базовое вычисление хэша

var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha256');
console.log(hash);

Результат возвращается в виде шестнадцатеричной строки (hex):

b94d27b9934d3e08a52e52d7da7dabfade...

Особенности SHA-256 в Jsrsasign

  • вход автоматически интерпретируется как UTF-8 строка
  • выход по умолчанию — hex-строка
  • поддерживается работа с байтовыми массивами

SHA-384 в Jsrsasign

SHA-384 используется в системах, где требуется повышенная криптостойкость без перехода к полной длине SHA-512.

Пример использования

var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha384');
console.log(hash);

Выходная строка:

bfd76e6fb1c4b5e9c5c7a3a8f1c2a6b...

Особенности SHA-384

  • более длинный хэш по сравнению с SHA-256
  • часто используется в TLS-конфигурациях
  • обеспечивает более высокий уровень устойчивости к перебору

SHA-512 в Jsrsasign

SHA-512 является самым «тяжёлым» из SHA-2 вариантов, обеспечивая максимальную длину хэша.

Пример вычисления

var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha512');
console.log(hash);

Результат:

309ecc489c12d6eb4cc40f50c902f2b4...

Особенности SHA-512

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

Унифицированный интерфейс MessageDigest

В Jsrsasign все SHA-2 алгоритмы можно использовать через единый интерфейс:

KJUR.crypto.MessageDigest.getHash(data, algorithm)

Поддерживаемые алгоритмы в контексте SHA-2:

  • sha256
  • sha384
  • sha512

Побайтовая работа с данными

Jsrsasign позволяет работать не только со строками, но и с байтовыми массивами.

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

var data = [0x61, 0x62, 0x63]; // "abc"
var hash = KJUR.crypto.MessageDigest.getHash(data, 'sha256');
console.log(hash);

Такой подход используется при обработке бинарных протоколов, файлов и сетевых пакетов.


HEX, Base64 и форматы вывода

По умолчанию Jsrsasign возвращает хэш в hex-формате. Однако в некоторых сценариях требуется Base64-представление.

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

var md = new KJUR.crypto.MessageDigest({alg: "sha256", prov: "cryptojs"});
md.updateString("hello world");
var hashHex = md.digest();

Для Base64 обычно применяется дополнительное преобразование через утилиты библиотеки:

var base64 = hextob64(hashHex);

Инкрементальное вычисление хэша

Для больших данных используется потоковая обработка:

var md = new KJUR.crypto.MessageDigest({alg: "sha512"});

md.updateString("hello ");
md.updateString("world");

var hash = md.digest();
console.log(hash);

Этот подход важен при обработке файлов и потоков данных, где невозможно загрузить всё содержимое сразу.


Сравнение SHA-256, SHA-384 и SHA-512

Длина выходного значения

  • SHA-256 → 256 бит (64 hex-символа)
  • SHA-384 → 384 бит (96 hex-символов)
  • SHA-512 → 512 бит (128 hex-символов)

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

  • SHA-256 быстрее на 32-битных системах
  • SHA-512 быстрее на 64-битных архитектурах
  • SHA-384 занимает промежуточное положение

Практическое применение

  • SHA-256: JWT, блокчейн, контроль целостности
  • SHA-384: TLS, сертификаты
  • SHA-512: высокозащищённые системы, криптографические архивы

Внутренняя реализация в Jsrsasign

Jsrsasign использует несколько криптографических провайдеров, включая:

  • собственную реализацию SHA-2
  • CryptoJS (в зависимости от конфигурации)

Выбор провайдера влияет на производительность:

var md = new KJUR.crypto.MessageDigest({
  alg: "sha256",
  prov: "cryptojs"
});

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

Jsrsasign преобразует входные строки в UTF-8 перед вычислением хэша.

Пример

KJUR.crypto.MessageDigest.getHash("тест", "sha256");

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

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

Безопасность использования SHA-2

SHA-256, SHA-384 и SHA-512 считаются криптографически стойкими при корректном использовании.

Однако важно учитывать:

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

Использование в прикладных задачах

Контроль целостности данных

var fileHash = KJUR.crypto.MessageDigest.getHash(fileContent, 'sha256');

Проверка паролей (устаревший подход без соли)

var hash = KJUR.crypto.MessageDigest.getHash(password, 'sha512');

Сравнение данных

if (hash1 === hash2) {
    // данные идентичны
}

Обработка больших данных

При работе с большими файлами SHA-512 часто предпочтительнее из-за оптимизации 64-битных операций.

Инкрементальный подход:

var md = new KJUR.crypto.MessageDigest({alg: "sha512"});

for (var i = 0; i < chunks.length; i++) {
    md.updateHex(chunks[i]);
}

var result = md.digest();

Совместимость с другими криптосистемами

Хэши SHA-2, полученные в Jsrsasign:

  • совместимы с OpenSSL
  • совпадают с Node.js crypto
  • подходят для JWT и JOSE-экосистемы

Пример сравнения с Node.js:

const crypto = require('crypto');
crypto.createHash('sha256').update('hello').digest('hex');

Результат совпадает с Jsrsasign при одинаковом входе.


Особенности выбора алгоритма

Выбор между SHA-256, SHA-384 и SHA-512 зависит от:

  • требований к безопасности
  • архитектуры системы
  • объёма данных
  • совместимости с внешними сервисами

SHA-256 остаётся стандартом де-факто, SHA-512 используется там, где важна максимальная криптостойкость, а SHA-384 — компромисс для TLS и сертификатов.