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 криптографические хэш-функции реализованы через единый интерфейс:
KJUR.crypto.MessageDigest
Этот класс поддерживает несколько алгоритмов, включая SHA-256, SHA-384 и SHA-512.
SHA-256 является наиболее часто используемым алгоритмом в веб-разработке, криптографических токенах и блокчейн-системах.
var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha256');
console.log(hash);
Результат возвращается в виде шестнадцатеричной строки (hex):
b94d27b9934d3e08a52e52d7da7dabfade...
SHA-384 используется в системах, где требуется повышенная криптостойкость без перехода к полной длине SHA-512.
var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha384');
console.log(hash);
Выходная строка:
bfd76e6fb1c4b5e9c5c7a3a8f1c2a6b...
SHA-512 является самым «тяжёлым» из SHA-2 вариантов, обеспечивая максимальную длину хэша.
var hash = KJUR.crypto.MessageDigest.getHash('hello world', 'sha512');
console.log(hash);
Результат:
309ecc489c12d6eb4cc40f50c902f2b4...
В Jsrsasign все SHA-2 алгоритмы можно использовать через единый интерфейс:
KJUR.crypto.MessageDigest.getHash(data, algorithm)
sha256sha384sha512Jsrsasign позволяет работать не только со строками, но и с байтовыми массивами.
var data = [0x61, 0x62, 0x63]; // "abc"
var hash = KJUR.crypto.MessageDigest.getHash(data, 'sha256');
console.log(hash);
Такой подход используется при обработке бинарных протоколов, файлов и сетевых пакетов.
По умолчанию 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);
Этот подход важен при обработке файлов и потоков данных, где невозможно загрузить всё содержимое сразу.
Jsrsasign использует несколько криптографических провайдеров, включая:
Выбор провайдера влияет на производительность:
var md = new KJUR.crypto.MessageDigest({
alg: "sha256",
prov: "cryptojs"
});
Jsrsasign преобразует входные строки в UTF-8 перед вычислением хэша.
KJUR.crypto.MessageDigest.getHash("тест", "sha256");
Особенности:
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:
Пример сравнения с 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 и сертификатов.