Perché generare un hash bcrypt online?
L'autenticazione HTTP Basic resta il modo più rapido per chiudere un'area di amministrazione, una preproduzione o una dashboard interna. Si basa su un file .htpasswd in cui ogni riga associa un identificativo a una password hashata - mai in chiaro.
Da Apache 2.4, il comando htpasswd -B produce bcrypt, ed è il formato raccomandato dalla documentazione ufficiale. Il problema: quel comando presuppone di aver installato apache2-utils su Debian o httpd-tools su RHEL. Su un computer Windows, su un hosting condiviso o da un'interfaccia web, spesso manca.
Tre situazioni in cui questo generatore ti toglie dai guai:
- Proteggere una preproduzione → Chiudere l'accesso a un ambiente di test prima che Google lo indicizzi
- Aggiungere un account senza accesso SSH → Creare la riga dal browser e incollarla tramite il file manager del tuo hosting
- Modernizzare un file esistente → Sostituire gradualmente le voci
$apr1$con voci$2y$
Come usare il generatore in 3 passaggi
Passo 1: inserire l'identificativo e la password
Inserisci il nome dell'account e la sua password. Il campo è mascherato per impostazione predefinita; fai clic sull'occhio per rileggere quanto digitato prima di convalidare. Il pulsante "Genera una password" estrae una stringa casuale di 16 caratteri se non ne hai già una.
Passo 2: regolare il fattore di costo
Il cursore parte da 10, il valore di htpasswd -B. Sali a 12 per un accesso sensibile. Ogni scatto raddoppia il tempo di calcolo: in fase di generazione e a ogni verifica del server.
Passo 3: copiare la riga
Vengono mostrati due risultati: l'hash da solo e la riga .htpasswd completa. Copia quest'ultima, incollala nel tuo file e ricarica la configurazione del server.
Anatomia di un hash bcrypt
Una riga .htpasswd si divide in due campi separati da due punti:
admin:$2y$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy
Il secondo campo si scompone così:
| Parte | Esempio | Ruolo |
|---|---|---|
| Identificatore di algoritmo | 2y | Dice al server che si tratta di bcrypt |
| Fattore di costo | 10 | Esponente: il calcolo esegue 2^10 = 1.024 round |
| Sale + digest | N9qo8uLOickgx2ZMRZoMye... | 53 caratteri: 22 per il sale da 128 bit, 31 per l'impronta |
A differenza di APR1-MD5, il sale non occupa un campo separato: è attaccato al digest nell'ultimo blocco. Resta leggibile in chiaro, il che è normale - il suo ruolo non è essere segreto, ma impedire che una tabella precalcolata serva a recuperare la password.
Capire il fattore di costo
Il costo è un esponente, non un moltiplicatore. Un costo di N esegue 2^N round di derivazione della chiave:
| Costo | Round | Tempo indicativo | Utilizzo |
|---|---|---|---|
| 8 | 256 | ~15 ms | Troppo basso oggi |
| 10 | 1.024 | ~60 ms | Predefinito di htpasswd -B, corretto |
| 12 | 4.096 | ~250 ms | Consigliato per un accesso sensibile |
| 14 | 16.384 | ~1 s | Latenza percepibile a ogni connessione |
Due cose da tenere a mente. In primo luogo, quel tempo si paga a ogni verifica, quindi a ogni richiesta HTTP Basic: un costo di 14 su una pagina il cui browser ripete l'autenticazione per ogni risorsa si sente subito. In secondo luogo, l'impostazione giusta dipende dal tuo hardware: misura piuttosto che copiare un valore, con l'obiettivo abituale di 100-250 ms sul server che eseguirà la verifica.
Proteggere una directory con Apache
1. Creare il file
Posiziona il tuo file .htpasswd fuori dalla root web, così non verrà mai servito via HTTP:
/var/www/secrets/.htpasswd
2. Dichiarare la protezione
Nel .htaccess della directory da proteggere, o nel blocco <Directory> del tuo VirtualHost:
AuthType Basic
AuthName "Area riservata"
AuthUserFile /var/www/secrets/.htpasswd
Require valid-user
3. Ricaricare la configurazione
sudo apachectl configtest && sudo systemctl reload apache2
Per nginx, la stessa coppia di file si dichiara così:
location /admin/ {
auth_basic "Area riservata";
auth_basic_user_file /var/www/secrets/.htpasswd;
}
nginx legge bcrypt dalla versione 1.0.3 sui sistemi la cui crypt_r() lo supporta, il che copre tutte le distribuzioni Linux comuni.
bcrypt a confronto con gli altri formati .htpasswd
| Formato | Prefisso | Costo di calcolo | Verdetto |
|---|---|---|---|
| bcrypt | $2y$ | Regolabile, 2^costo round | Consigliato per ogni nuovo progetto |
| APR1-MD5 | $apr1$ | 1.000 iterazioni MD5 | Accettabile, massima compatibilità |
| SHA-1 | {SHA} | 1 iterazione, senza sale | Da evitare: niente sale, decifrabile con una tabella |
| crypt() DES | nessuno | 25 iterazioni, troncato a 8 caratteri | Obsoleto, non usarlo più |
In sintesi: bcrypt è l'unico formato .htpasswd il cui costo si adatta all'hardware dell'epoca. Gli altri tre hanno un costo fisso, deciso negli anni '90 o 2000, che il progresso delle GPU ha reso irrisorio. Tieni l'APR1-MD5 solo se il tuo server non sa leggere $2y$.
Verificare l'hash dalla riga di comando
Il risultato di questo strumento è un hash bcrypt standard, verificabile con le utilità di sistema:
# Generare l'equivalente con htpasswd (pacchetto apache2-utils / httpd-tools)
htpasswd -nbB admin laMiaPassword
# Imporre un fattore di costo di 12
htpasswd -nbB -C 12 admin laMiaPassword
Le due stringhe non saranno identiche - il sale cambia a ogni estrazione -, ma entrambe validano la stessa password. Per controllarlo:
# Ripetere la verifica con il sale dell'hash esistente
python3 -c "import bcrypt,sys; print(bcrypt.checkpw(b'laMiaPassword', sys.argv[1].encode()))" '$2y$10$...'
FAQ - Domande frequenti
D: Cos'è il formato $2y$?
R: È il marcatore di bcrypt in un file .htpasswd. L'hash completo segue il modello $2y$<costo>$<sale><digest>: un identificatore di algoritmo, un fattore di costo a due cifre e 53 caratteri con il sale da 128 bit e l'impronta. È ciò che scrive htpasswd -B.
D: Che differenza c'è tra $2a$, $2b$ e $2y$?
R: Nessuna di sostanza: sono tre marcatori dello stesso algoritmo. $2y$ è stato introdotto da PHP nel 2011 per segnalare un'implementazione corretta di un bug sui caratteri non ASCII, un bug assente dalla libreria usata qui. Apache e nginx accettano tutti e tre.
D: Quale fattore di costo scegliere?
R: 10 come predefinito, 12 per un accesso sensibile. Il riflesso giusto è misurare sul server che eseguirà la verifica e puntare a 100-250 ms: abbastanza lento da ostacolare un attacco a dizionario, abbastanza veloce da non notarsi nell'uso quotidiano.
D: Perché non posso superare 15?
R: Poiché il costo è un esponente, 16 richiede già diversi secondi di calcolo e supererebbe il tempo concesso a una richiesta HTTP. Per un costo maggiore, genera l'hash in locale con htpasswd -B -C 18.
D: bcrypt è meglio di APR1-MD5?
R: Sì, nettamente. APR1-MD5 esegue 1.000 iterazioni di MD5, che l'hardware specializzato calcola a miliardi al secondo. bcrypt richiede memoria e accessi non sequenziali, limitando fortemente il parallelismo di una GPU. Per un nuovo file .htpasswd, bcrypt senza esitare.
D: Posso usare una password più lunga di 72 caratteri?
R: No, e non è un limite di questo strumento: bcrypt ignora semplicemente tutto ciò che supera 72 byte. Una password di 80 caratteri equivarrebbe quindi ai suoi primi 72. Attenzione: un carattere accentato conta come due byte in UTF-8.
D: La password viene memorizzata da qualche parte?
R: No. Viaggia in HTTPS fino all'API CaptainDNS per la durata del calcolo, poi viene dimenticata. Nessun database, nessun registro con la password in chiaro.
D: Dove va posizionato il file .htpasswd?
R: Fuori dalla root web, ad esempio in /var/www/secrets/. Se si trova in una directory servita via HTTP, un visitatore potrebbe scaricarlo e attaccare gli hash offline - che è esattamente ciò che il fattore di costo rende costoso, anche se non impossibile.
Strumenti complementari
| Strumento | Utilità |
|---|---|
| Generatore APR1-MD5 | Produrre una riga .htpasswd nel formato storico di Apache |
| Generatore di password | Estrarre una password solida prima di hasharla |
| Hash Generator | Calcolare MD5, SHA-1, SHA-256 e SHA-512 di un testo |
| Codificatore Base64 | Codificare l'header Authorization di una richiesta Basic |
| Analizzatore di header HTTP | Controllare gli header restituiti da un'area protetta |
Risorse utili
- Documentazione Apache - htpasswd (opzioni del comando, incluse -B e -C)
- Documentazione Apache - Autenticazione (configurazione dell'autenticazione Basic)
- A Future-Adaptable Password Scheme (articolo fondativo di bcrypt, Provos e Mazieres, 1999)
- RFC 7617 - The Basic HTTP Authentication Scheme (specifica dello schema Basic)
Impegno per la privacy
La tua password viene inviata all'API CaptainDNS solo per calcolare l'hash, su una connessione crittografata. Non viene né memorizzata né registrata. Vengono conservate solo metriche tecniche anonime (durata del trattamento, codice di risposta).