SHA-1 Hash Generator
Генерировать SHA-1-хеш из любого текста
Входной текст
SHA-1-хеш
SHA-1-хеш появится здесь…
Что такое SHA-1?
SHA-1 (Secure Hash Algorithm 1) — криптографическая хеш-функция, которая вычисляет фиксированный 160-битный (20-байтовый) дайджест для любых входных данных. Алгоритм опубликован NSA и стандартизирован NIST в 1995 году как FIPS PUB 180-1, а позднее задокументирован в RFC 3174. SHA-1 создавался как более надёжная замена SHA-0 и MD5. Алгоритм обрабатывает входные данные блоками по 512 бит через 80 раундов побитовых операций, формируя 40-символьный шестнадцатеричный отпечаток, который более десятилетия служил основой SSL/TLS, PGP, SSH и IPsec.
Как и все криптографические хеш-функции, SHA-1 реализует одностороннее преобразование: вычислить хеш по входным данным быстро, а восстановить исходные данные по хешу вычислительно невозможно. Изменение одного бита во входных данных приводит к полностью другому 160-битному дайджесту — это свойство называется лавинным эффектом. SHA-1 отображает произвольно большое пространство входных данных на фиксированный 160-битный выход, что математически неизбежно приводит к коллизиям (два разных входа с одинаковым хешем). Требование безопасности хеш-функции состоит в том, что поиск таких коллизий должен требовать примерно 2^80 операций — половину длины выходного блока в битах.
В 2017 году Google и CWI Amsterdam опубликовали атаку SHAttered, продемонстрировав первую практическую коллизию SHA-1 путём создания двух разных PDF-файлов с одинаковым дайджестом. Атака потребовала около 2^63.1 вычислений SHA-1 — значительно меньше теоретической границы 2^80. В 2020 году Gaetan Leurent и Thomas Peyrin снизили стоимость атаки с выбранным префиксом до примерно 2^63.4 операций. В результате все основные браузеры, удостоверяющие центры и органы стандартизации признали SHA-1 устаревшим для цифровых подписей и TLS-сертификатов. Однако SHA-1 по-прежнему активно применяется в задачах, не связанных с безопасностью: идентификаторы объектов Git (хотя Git мигрирует на SHA-256), устаревшие конструкции HMAC и контрольные суммы файлов там, где устойчивость к коллизиям от злоумышленника не требуется.
Зачем использовать этот генератор SHA-1?
Генерируйте SHA-1-хеши мгновенно — без установки программ и написания кода. Вставьте текст и получите 40-символьный шестнадцатеричный дайджест в реальном времени. Удобно для проверки устаревших контрольных сумм, отладки внутренностей Git или тестирования хеш-цепочек.
Сценарии использования SHA-1
SHA-1 против других хеш-алгоритмов
SHA-1 производит 160-битный дайджест — длиннее, чем MD5 (128 бит), но значительно короче алгоритмов семейства SHA-2. В таблице ниже сравниваются размеры дайджестов, стандарты и подходящие сценарии использования для каждого алгоритма.
| Алгоритм | Размер дайджеста | Длина в hex | Стандарт | Оптимален для |
|---|---|---|---|---|
| SHA-1 | 160 bits | 40 hex chars | 1995 / RFC 3174 | Deprecated — legacy git commits, old TLS |
| SHA-256 | 256 bits | 64 hex chars | 2001 / FIPS 180-4 | TLS certificates, blockchain, JWTs |
| SHA-384 | 384 bits | 96 hex chars | 2001 / FIPS 180-4 | Government systems, higher security margin |
| SHA-512 | 512 bits | 128 hex chars | 2001 / FIPS 180-4 | Digital signatures, HMAC with large keys |
| MD5 | 128 bits | 32 hex chars | 1992 / RFC 1321 | Checksums only — broken since 2004 |
| SHA-3 | 256 bits | 64 hex chars | 2015 / FIPS 202 | Post-quantum readiness, alternative to SHA-2 |
| BLAKE3 | 256 bits | 64 hex chars | 2020 | High-performance checksums, Merkle trees |
Как работает SHA-1
SHA-1 построен на конструкции Меркле-Дамгарда: сообщение дополняется, разбивается на блоки по 512 бит, и каждый блок обрабатывается через 80 раундов побитовых операций, смешивающих входные данные с расписанием сообщений, производным от блока. Пять 32-битных переменных состояния (H0–H4) хранят текущее состояние хеша, а конкатенация этих слов в конце формирует 160-битный дайджест.
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| Шаг | Описание |
|---|---|
| Padding | Append a 1-bit, then zeros, until message length is 448 mod 512. Append the original length as a 64-bit big-endian integer. |
| Block splitting | Divide the padded message into 512-bit (64-byte) blocks. |
| Expansion | Expand each 16-word block into 80 words using a left-rotate-by-1 XOR feedback schedule. |
| Compression | Process 80 rounds per block using four nonlinear functions (Ch, Parity, Maj, Parity) across rounds 0-19, 20-39, 40-59, and 60-79. |
| Output | Concatenate the five 32-bit state words (H0-H4) into a 160-bit (20-byte) digest, rendered as 40 hexadecimal characters. |
Ключевое отличие SHA-1 от MD5 — количество переменных состояния (5 против 4), количество раундов на блок (80 против 64) и использование расписания сообщений с обратной связью через левый сдвиг. Эти различия дают SHA-1 больший выход (160 против 128 бит) и изначально обеспечивали более высокий запас безопасности, хотя оба алгоритма сейчас считаются скомпрометированными с точки зрения устойчивости к коллизиям.
Примеры кода
Как генерировать SHA-1-хеши на популярных языках и в различных средах. В отличие от MD5, SHA-1 доступен через браузерный Web Crypto API, что позволяет использовать его без внешних библиотек как в браузере, так и в среде Node.js.
// SHA-1 is available in the Web Crypto API
async function sha1(text) {
const data = new TextEncoder().encode(text)
const hashBuffer = await crypto.subtle.digest('SHA-1', data)
const hashArray = Array.from(new Uint8Array(hashBuffer))
return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')
}
await sha1('hello world')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
// Node.js (built-in crypto module)
const crypto = require('crypto')
crypto.createHash('sha1').update('hello world').digest('hex')
// → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"import hashlib
# Basic SHA-1 hash
result = hashlib.sha1(b'hello world').hexdigest()
print(result) # → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a string (encode to bytes first)
text = 'hello world'
hashlib.sha1(text.encode('utf-8')).hexdigest()
# → "2aae6c35c94fcfb415dbe95f408b9ce91ee846ed"
# Hash a file in chunks
with open('file.bin', 'rb') as f:
sha1 = hashlib.sha1()
for chunk in iter(lambda: f.read(8192), b''):
sha1.update(chunk)
print(sha1.hexdigest())package main
import (
"crypto/sha1"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha1.Sum(data)
fmt.Printf("%x\n", hash)
// → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
}# Using sha1sum (Linux) or shasum (macOS) echo -n "hello world" | sha1sum # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # macOS echo -n "hello world" | shasum -a 1 # → 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed - # Hash a file sha1sum package.json # → a1b2c3d4e5f6... package.json # Using openssl (cross-platform) echo -n "hello world" | openssl sha1 # → SHA1(stdin)= 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed