Perché generare un hash APR1-MD5 online?
L'autenticazione HTTP Basic resta il modo più rapido per chiudere un'area di amministrazione, un ambiente di staging o una dashboard interna. Si basa su un file .htpasswd in cui ogni riga associa un nome utente a una password hashata, mai in chiaro.
Il problema: per produrre quell'hash serve di norma il comando htpasswd, quindi il pacchetto apache2-utils su Debian o httpd-tools su RHEL. Su una postazione Windows, su un hosting condiviso o da un'interfaccia web, quel comando spesso manca.
Tre situazioni in cui questo generatore toglie d'impaccio:
- Proteggere uno staging → Chiudere l'accesso a un ambiente di collaudo prima che Google lo indicizzi
- Aggiungere un account senza accesso SSH → Creare la riga dal browser e incollarla tramite il gestore file del provider
- Migrare una configurazione → Ricostruire un file
.htpasswdperduto a partire dalle credenziali note
Come usare il generatore in 3 passi
Passo 1: inserire nome utente e password
Digita il nome dell'account e la sua password. Il campo è nascosto per impostazione predefinita; clicca sull'icona a occhio per rileggere quanto hai scritto prima di confermare.
Passo 2: lasciare che il sale sia generato
Nella quasi totalità dei casi, lascia vuoto il campo del sale: il server estrarrà un sale casuale di 8 caratteri. Compilalo solo per riprodurre un hash esistente in modo identico.
Passo 3: copiare la riga
Compaiono 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 una riga .htpasswd
Una riga si divide in due campi separati dai due punti:
admin:$apr1$Xq7nD2mR$5CqLZ.k1qLkOvVQ0uZ9Yl.
Il secondo campo si scompone a sua volta in tre parti delimitate da $:
| Parte | Esempio | Ruolo |
|---|---|---|
| Identificativo dell'algoritmo | apr1 | Indica al server che si tratta dell'MD5 con sale di Apache |
| Sale | Xq7nD2mR | 8 caratteri casuali, memorizzati in chiaro nel file |
| Digest | 5CqLZ.k1qLkOvVQ0uZ9Yl. | 22 caratteri, risultato delle 1.000 iterazioni |
Il sale non è un segreto: è leggibile nel file. Il suo ruolo è impedire che una tabella pre-calcolata (rainbow table) serva a risalire alla password, e garantire che due account con la stessa password non abbiano lo stesso digest.
Che cosa fa davvero l'algoritmo $apr1$
APR1-MD5 non è un semplice md5(password + sale). Concatena:
- Due impronte iniziali - una su
password + $apr1$ + sale, l'altra supassword + sale + password - Una miscelazione dipendente dalla lunghezza - frammenti della seconda impronta vengono reimmessi nella prima, byte per byte
- 1.000 iterazioni - a ogni giro, password, sale e impronta precedente sono ricombinati secondo uno schema che dipende dal numero del giro
- Una codifica base64 «crypt» - i 16 byte finali vengono riletti in ordine intrecciato e codificati sull'alfabeto
./0-9A-Za-z
Sono queste 1.000 iterazioni a fare la differenza rispetto a un MD5 nudo: moltiplicano per mille il costo di un tentativo, rallentando nella stessa misura un attacco a dizionario.
Proteggere una directory con Apache
1. Creare il file
Colloca il tuo file .htpasswd fuori dalla radice web, perché non venga mai servito via HTTP:
/var/www/secrets/.htpasswd
2. Dichiarare la protezione
Nel .htaccess della directory da proteggere, oppure 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
Su nginx, la stessa coppia di file si dichiara così:
location /admin/ {
auth_basic "Area riservata";
auth_basic_user_file /var/www/secrets/.htpasswd;
}
APR1-MD5 a confronto con gli altri formati .htpasswd
| Formato | Prefisso | Costo di calcolo | Verdetto |
|---|---|---|---|
| bcrypt | $2y$ | Regolabile (fattore di costo) | Consigliato per ogni nuovo progetto |
| APR1-MD5 | $apr1$ | 1.000 iterazioni MD5 | Accettabile, compatibilità massima |
| SHA-1 | {SHA} | 1 iterazione, senza sale | Da evitare: niente sale, violabile con tabelle |
| crypt() DES | nessuno | 25 iterazioni, troncato a 8 caratteri | Obsoleto, da non usare più |
In sintesi: se il tuo server accetta bcrypt (htpasswd -B), usalo. APR1-MD5 è la migliore opzione rimasta quando bcrypt non è disponibile, e vale infinitamente più di un {SHA} senza sale.
Verificare l'hash da riga di comando
A parità di sale, il risultato di questo strumento è identico a quello delle utility di sistema:
# Con htpasswd (pacchetto apache2-utils / httpd-tools)
htpasswd -nbm admin miaPassword
# Con OpenSSL, imponendo il sale
openssl passwd -apr1 -salt Xq7nD2mR miaPassword
Il secondo esempio serve anche a collaudare questo strumento: inserisci lo stesso sale nel modulo e devi ottenere esattamente la stessa stringa.
Per verificare che una password corrisponda a una riga esistente, rileggi il sale contenuto nell'hash memorizzato e ripeti il calcolo con quel sale.
FAQ - Domande frequenti
D: Che cos'è il formato $apr1$?
R: È il formato di hashing storico di Apache, chiamato anche APR1-MD5. Applica 1.000 iterazioni di MD5 sulla password e su un sale di 8 caratteri, poi codifica il risultato nell'alfabeto base64 di crypt. Il prefisso $apr1$ funge da identificativo dell'algoritmo.
D: APR1-MD5 è ancora sicuro?
R: È ben più solido di un MD5 nudo, ma resta rapido da calcolare per un attaccante dotato di GPU. Per un progetto nuovo, preferisci bcrypt tramite htpasswd -B. APR1-MD5 conserva il suo interesse quando prevale la compatibilità: vecchie versioni di Apache, nginx senza supporto bcrypt, apparati di rete.
D: Questo hash funziona con nginx?
R: Sì. Il modulo ngx_http_auth_basic_module di nginx legge il formato Apache, $apr1$ compreso. La riga generata si usa così com'è con auth_basic_user_file.
D: Perché ottengo un hash diverso ogni volta?
R: A ogni generazione viene estratto un nuovo sale casuale. I due hash sono validi per la stessa password: in fase di verifica il server rilegge il sale memorizzato nell'hash e rifà il calcolo. Compila il campo del sale se vuoi un risultato riproducibile.
D: La password viene memorizzata da qualche parte?
R: No. Transita in HTTPS verso l'API CaptainDNS per il tempo del calcolo, poi viene scartata. Né database, né log con la password in chiaro.
D: Posso usare accenti o simboli?
R: Sì, il calcolo lavora sui byte UTF-8 della password. Un'avvertenza: un client HTTP datato può codificare i caratteri non ASCII in modo diverso, e l'autenticazione fallirebbe. Nel dubbio, resta in ASCII.
D: Dove va collocato il file .htpasswd?
R: Fuori dalla radice web, per esempio in /var/www/secrets/. Se si trova in una directory servita via HTTP, un visitatore potrebbe scaricarlo e attaccare gli hash offline.
Strumenti complementari
| Strumento | Utilità |
|---|---|
| Generatore di password | Estrarre una password solida prima di hasharla |
| Generatore di hash | 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 |
| Test HSTS | Assicurarsi che l'accesso protetto passi davvero da HTTPS |
Risorse utili
- Documentazione Apache - htpasswd (opzioni del comando e formati supportati)
- Documentazione Apache - Autenticazione (implementazione dell'autenticazione Basic)
- RFC 7617 - The Basic HTTP Authentication Scheme (specifica dello schema Basic)
- RFC 1321 - MD5 (specifica della funzione MD5)
Impegno sulla riservatezza
La tua password è trasmessa all'API CaptainDNS unicamente per calcolare l'hash, su una connessione cifrata. Non è né memorizzata né registrata. Restano solo metriche tecniche anonime (durata di elaborazione, codice di risposta).