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 році Гаетан Льорен та Томас Пейрен ще більше знизили вартість атаки за допомогою атаки колізії з обраним префіксом, що вимагала приблизно 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