Dove trovare le specifiche esatte per i "valori" di sha512?

4

Attualmente sto lavorando all'hashing con SHA512.

A mia conoscenza, il risultato di tale hashing viene spesso passato come una stringa in questo formato

$6$salt$hashed-secret

E ora mi sto semplicemente chiedendo: all'interno di questa stringa, qual è la vera natura di "sale" e "hashed-secret" --- sono "reali" stringhe (come mostrato here ad esempio, come output dello strumento crypt); oppure c'è una "regola" che dice che quelle stringhe dovrebbero sempre essere base64 codificate.

    
posta GhostCat 20.01.2017 - 13:37
fonte

4 risposte

10

È necessario distinguere tra SHA512 (una funzione di hash di uso generale) e sha512crypt (una funzione di hashing della password basata su SHA512). Una stringa che inizia con $6$ è l'output di sha512crypt. È possibile che tu lo sapessi già, ma la formulazione della tua domanda lascia aperta la possibilità che tu non l'abbia fatto.

Le specifiche per sha512crypt sono qui . Non dice molto sulla costruzione del sale, solo questo:

For the SHA-based methods the SALT string can be a simple string of which up to 16 characters are used.

Almeno una implementazione ( per python ) dice che il sale deve essere composto da alfanumerici , punto e barra (i caratteri utilizzati nella cripta unix originale basata su DES). Penso che sarebbe saggio attenersi a quei personaggi.

Il hashed-secret è codificato in base64, non con l'alfabeto base64 MIME ma con l'alfabeto unix crypt.

The encoding used is as follows:

           111111111122222222223333333333444444444455555555556666
 0123456789012345678901234567890123456789012345678901234567890123
 ----------------------------------------------------------------
 ./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    
risposta data 20.01.2017 - 14:21
fonte
1

Questo formato è solo una rappresentazione comune del valore hash sottostante. L'hash stesso è un valore binario di una lunghezza specificata (in base allo specifico algoritmo di hash utilizzato). Nel caso di SHA-512, sono 512 cifre binarie, o 64 byte, o 128 caratteri esadecimali, o una stringa codificata Base64 lunga 88 caratteri. Corrispondono tutti allo stesso hash sottostante, proprio come "uno", "un" e "eins" corrispondono tutti a 1.

Allo stesso modo, il sale è solo un mucchio di cifre binarie. Puoi rappresentarlo in qualsiasi forma tu scelga, purché tu lo rappresenti allo stesso modo ovunque ti aspetti di poter confrontare i valori hash. La codifica Base64 sembra essere un modo abbastanza ragionevole di trasferire dati binari arbitrari in giro. In alcuni casi, il gruppo di cifre binarie corrisponde a una stringa in qualche formato di codifica del testo, nel qual caso non sarebbe necessaria la codifica, tecnicamente, ma sarebbe necessario un modo per rilevare se la stringa era intesa come una stringa , o come rappresentazione del binario sottostante.

    
risposta data 20.01.2017 - 14:27
fonte
1

often passed around as a string in this format

Penso di essere invitato a parti diverse rispetto a te.

Questo è il formato utilizzato per memorizzare le password su sistemi Unix ed elaborato dalla crypt . È anche usato in altri sistemi (ad es. apache ).

is there a "rule" that says that those strings should always be base64 encoded.

Crypt non usa base64 (o almeno non lo fa mai per i vecchi formati di password) utilizza la codifica radix-64. Entrambi utilizzano 64 caratteri ASCII per codificare i dati binari - ma non sono compatibili .

AFAIK non ci sono standard che documentino che definiscono questi record - solo una convenzione.

    
risposta data 20.01.2017 - 14:39
fonte
0

Solo per la cronaca: basandomi sull'input fornito dalle altre risposte, ho finalmente utilizzato le parole di ricerca "corrette"; che mi ha indicato

a questa domanda su SO ... quella mi ha dato la cosa esatta che stavo cercando.

    
risposta data 24.01.2017 - 15:31
fonte

Leggi altre domande sui tag