SHA-256 и SHA-512 относятся к семейству SHA-2 (Secure Hash Algorithm 2), разработанному для создания устойчивых к коллизиям и необратимых хеш-значений. Их основная задача — преобразование входных данных произвольной длины в фиксированную строку, называемую хешем.
Ключевые свойства:
SHA-256 и SHA-512 различаются в первую очередь длиной выходного значения и внутренней архитектурой.
В Node.js работа с SHA реализуется через встроенный модуль
crypto, который предоставляет низкоуровневый доступ к
криптографическим алгоритмам.
const crypto = require('crypto');
const data = 'password123';
const hash = crypto
.createHash('sha256')
.update(data)
.digest('hex');
console.log(hash);
Результат — 64-символьная строка в шестнадцатеричном формате.
const crypto = require('crypto');
const data = 'password123';
const hash = crypto
.createHash('sha512')
.update(data)
.digest('hex');
console.log(hash);
Результат — 128-символьный хеш.
В браузерах используется стандарт Web Crypto API, который работает асинхронно.
async function sha256(message) {
const encoder = new TextEncoder();
const data = encoder.encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-256', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
sha256('password123').then(console.log);
async function sha512(message) {
const encoder = new TextEncoder();
const data = encoder.encode(message);
const hashBuffer = await crypto.subtle.digest('SHA-512', data);
const hashArray = Array.from(new Uint8Array(hashBuffer));
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
}
sha512('password123').then(console.log);
SHA-256 и SHA-512 часто ошибочно используют для хранения паролей напрямую, что создаёт серьёзные уязвимости.
Основная проблема:
Простой пример небезопасного подхода:
const hash = crypto
.createHash('sha256')
.update(password)
.digest('hex');
Такой подход считается устаревшим для хранения паролей.
Соль — случайная строка, добавляемая к паролю перед хешированием.
const crypto = require('crypto');
function hashPassword(password, salt) {
return crypto
.createHash('sha256')
.update(password + salt)
.digest('hex');
}
const salt = crypto.randomBytes(16).toString('hex');
const hash = hashPassword('password123', salt);
console.log({ salt, hash });
Преимущества соли:
Для повышения безопасности SHA применяют многократно:
const crypto = require('crypto');
function iterativeHash(password, iterations = 100000) {
let hash = password;
for (let i = 0; i < iterations; i++) {
hash = crypto
.createHash('sha256')
.update(hash)
.digest('hex');
}
return hash;
}
console.log(iterativeHash('password123'));
Недостаток подхода:
| Параметр | SHA-256 | SHA-512 |
|---|---|---|
| Длина хеша | 256 бит | 512 бит |
| Скорость | выше на 32-bit CPU | выше на 64-bit CPU |
| Устойчивость | высокая | выше |
| Практика для паролей | не рекомендуется | не рекомендуется |
Оба алгоритма не предназначены для хранения паролей, несмотря на их криптографическую стойкость.
Ключевая проблема заключается в том, что SHA:
Это делает его уязвимым для GPU- и ASIC-атак.
В современных системах используются специализированные алгоритмы:
const crypto = require('crypto');
crypto.pbkdf2(
'password123',
'salt',
100000,
64,
'sha512',
(err, derivedKey) => {
console.log(derivedKey.toString('hex'));
}
);
Здесь SHA-512 используется только как внутренняя хеш-функция, но ключевым фактором является количество итераций.
При обработке одинакового входа:
const crypto = require('crypto');
const input = 'example';
console.log(crypto.createHash('sha256').update(input).digest('hex'));
console.log(crypto.createHash('sha512').update(input).digest('hex'));
Наблюдаются различия:
На практике:
SHA-алгоритмы в JavaScript используются в:
Но для паролей их применение ограничено безопасными обёртками (PBKDF2, bcrypt и аналоги).
Эти ошибки приводят к предсказуемой уязвимости даже при использовании криптографически стойких функций.
SHA-256 оправдан в случаях:
SHA-512 оправдан в случаях:
В задачах паролей выбор между ними вторичен, поскольку оба не предназначены для этой цели.