Generator Hasha SHA-1
Generuj hash SHA-1 z dowolnego tekstu
Tekst wejściowy
Hash SHA-1
Hash SHA-1 pojawi się tutaj…
Czym jest haszowanie SHA-1?
SHA-1 (Secure Hash Algorithm 1) to kryptograficzna funkcja skrótu produkująca stały 160-bitowy (20-bajtowy) skrót z dowolnych danych wejściowych. Opublikowana przez NSA i ustandaryzowana przez NIST w 1995 roku jako FIPS PUB 180-1, a następnie udokumentowana w RFC 3174, SHA-1 była zaprojektowana jako mocniejszy następca SHA-0 i MD5. Algorytm przetwarza dane wejściowe w 512-bitowych blokach przez 80 rund operacji bitowych, produkując 40-znakowy szesnastkowy odcisk palca, który przez ponad dekadę stanowił fundament SSL/TLS, PGP, SSH i IPsec.
Jak wszystkie kryptograficzne funkcje skrótu, SHA-1 jest przekształceniem jednokierunkowym: obliczenie skrótu z danych wejściowych jest szybkie, ale odtworzenie danych wejściowych z samego skrótu jest obliczeniowo niewykonalne. Zmiana jednego bitu na wejściu powoduje całkowicie inny 160-bitowy skrót — właściwość zwana efektem lawinowym. SHA-1 odwzorowuje dowolnie duką przestrzeń wejściową na stałe 160-bitowe wyjście, co oznacza, że kolizje (dwa różne dane wejściowe dające ten sam skrót) matematycznie muszą istnieć. Twierdzenie bezpieczeństwa funkcji skrótu mówi, że znalezienie takich kolizji powinno wymagać około 2^80 operacji — połowy długości bitów wyjścia.
W 2017 roku Google i CWI Amsterdam opublikowały atak SHAttered, demonstrując pierwszą praktyczną kolizję SHA-1 przez wyprodukowanie dwóch różnych plików PDF z tym samym skrótem. Atak wymagał około 2^63,1 obliczeń SHA-1 — znacznie poniżej teoretycznej granicy 2^80. W 2020 roku Gaetan Leurent i Thomas Peyrin jeszcze bardziej obniżyli koszt atakiem kolizji z wybranym prefiksem, wymagającym około 2^63,4 operacji. W rezultacie wszystkie główne przeglądarki, urzędy certyfikacji i organy normalizacyjne wycofały SHA-1 dla podpisów cyfrowych i certyfikatów TLS. Jednak SHA-1 pozostaje aktywnie używany do celów niezwiązanych z bezpieczeństwem: identyfikatory obiektów Git (choć Git migruje do SHA-256), starsze konstrukcje HMAC i sumy kontrolne integralności plików, gdzie odporność na kolizje w warunkach przeciwnika nie jest wymagana.
Dlaczego warto używać tego generatora SHA-1?
Generuj skróty SHA-1 natychmiast bez instalowania czegokolwiek ani pisania kodu. Wklej tekst i uzyskaj 40-znakowy skrót szesnastkowy w czasie rzeczywistym — przydatne do weryfikacji starszych sum kontrolnych, debugowania mechanizmów wewnętrznych Git lub testowania przepływów pracy opartych na skrótach.
Przypadki użycia SHA-1
SHA-1 a inne algorytmy skrótu
SHA-1 produkuje 160-bitowy skrót — dłuższy niż MD5 (128 bitów), ale znacznie krótszy niż algorytmy z rodziny SHA-2. Poniższa tabela porównuje rozmiary skrótów, standardy i odpowiednie przypadki użycia dla każdego algorytmu.
| Algorytm | Rozmiar skrótu | Długość hex | Standard | Najlepszy do |
|---|---|---|---|---|
| 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 |
Jak działa SHA-1
SHA-1 stosuje konstrukcję Merkle-Damgard: komunikat jest uzupełniany, dzielony na 512-bitowe bloki, a każdy blok jest przetwarzany przez 80 rund operacji bitowych, które mieszają dane wejściowe z harmonogramem komunikatów wyprowadzonym z bloku. Pięć 32-bitowych słów stanu (H0 do H4) przechowuje bieżący stan skrótu, a końcowe połączenie tych słów daje 160-bitowy skrót.
SHA-1: 2aae6c35c94fcfb415dbe95f408b9ce91ee846ed
(160 bits = 20 bytes = 40 hex characters)
| Krok | Opis |
|---|---|
| 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. |
Kluczowa różnica między SHA-1 a MD5 to liczba słów stanu (5 w porównaniu z 4), liczba rund na blok (80 w porównaniu z 64) oraz zastosowanie harmonogramu komunikatów ze sprzężeniem zwrotnym opartym na rotacji w lewo. Różnice te dają SHA-1 większe wyjście (160 w porównaniu z 128 bitami) i pierwotnie zapewniały wyższy margines bezpieczeństwa, choć oba algorytmy są teraz uważane za złamane pod względem odporności na kolizje.
Przykłady kodu
Jak generować skróty SHA-1 w popularnych językach i środowiskach. W przeciwieństwie do MD5, SHA-1 jest dostępne w przeglądarce przez Web Crypto API, dzięki czemu można go używać bez zewnętrznych bibliotek zarówno w przeglądarce, jak i w środowisku 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