Implicazioni dell'hash su UTF-8 in una funzione crittografica

2

So che la maggior parte delle funzioni di hash oggi usano la codifica Base64 per le loro funzioni, con conseguente hash che usano a-Z e 0-9 e, a volte, altri caratteri speciali. Ciò comporta 62-76ish possibili valori per ogni carattere, quindi se il tuo hash finisce per dire, 70 caratteri, ci sono 70 ^ 62 combinazioni possibili.

E se esistesse un hashing funzionante progettato per sfruttare UTF-8? Da ciò che ho capito ci sono circa 100.000 valori possibili per ogni personaggio. Ciò significa, per quanto posso dire, che ci sarebbero 70 ^ 100.000 valori possibili, il che è molto. Sembra che non potresti creare un tavolo arcobaleno.

Inoltre, so che la velocità è molto importante nelle funzioni di hashing. Questo sarebbe intrinsecamente più lento di una funzione di hashing di Base64?

So che "bit di entropia" hanno molto a che fare con la sicurezza di una password. Questo in qualche modo migliora quei bit entropiati? Sono abbastanza confuso sull'entropia, a dire il vero.

Nota che non sto parlando di combinazione una funzione esistente con UTF8. Mi chiedo se sia stata creata una funzione di hashing crittografica completamente nuova per sfruttare il set di caratteri più grande di UTF-8, sarebbe meglio (almeno in teoria) rispetto alle funzioni esistenti?

Da quanto ho letto sembra che ci siano alcuni problemi con bit che girano intorno e causano confusione. Sarebbe possibile aggirare questo, o è la ragione per cui non è possibile utilizzare con successo UTF-8 per le password, in quanto il rischio di collisione aumenta in modo drammatico e imprevedibile?

    
posta Asa 03.09.2015 - 22:15
fonte

3 risposte

7

Innanzitutto, Base64 userà, beh, 64 caratteri diversi (da cui il nome) per codificare i dati binari. Il quasi unico insieme di simboli usati è questo:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

Non sono a conoscenza di alcuna implementazione che ne utilizza una diversa.

Secondo Wikipedia , "Una funzione di hash è una funzione che può essere utilizzata per mappare i dati digitali di dimensione arbitraria a dati digitali di dimensioni fisse. " In sostanza, si utilizza una funzione di hash per trasformare un testo di dimensioni indeterminate in un numero di dimensioni fisse.

I dati restituiti dalla funzione di hashing sono binari , non testuali. Sembra un testo perché è più utile (e facile) codificare il risultato in una rappresentazione testuale piuttosto che gestirne uno binario. Quindi generalmente (ma non sempre) codificano il risultato prima di visualizzarlo. Generalmente la funzione di hash restituirà codifica esadecimale , non base64.

Su PHP , se esegui questo:

$a = sha1('some string', true);

Restituirà i dati binari, non la rappresentazione esadecimale.

Su Python , puoi usare sha.digest() per ottenere lo stesso risultato: otterrai il binario Rappresentazione a 20 byte, non il valore codificato.

Quando codifichi i tuoi dati binari in base64 (o uuencode , o yEnc ), non stai cambiando i dati, ma solo la rappresentazione. È proprio come la relazione tra one trillion, two hundred and seventy four million, five hundred and two thousand, nine hundred and fifty tree e 1274502953 . La codifica non modifica il valore.

L'uso di UTF-8, UTF-32, Base64 o ASCII non cambierà nulla.

    
risposta data 03.09.2015 - 22:53
fonte
6

I know that most hash functions today use Base64 encoding for their functions, resulting in hashes that use a-Z and 0-9, and, sometimes, other special characters. This results in 62-76ish possible values for each character, so if your hash ends up being say, 70 characters long, there are 70^62 possible combinations.

La maggior parte degli hash è espressa usando la notazione esadecimale o base64. L'hash stesso è semplicemente una stringa di bit, in quanto tale non è direttamente esplicabile come caratteri leggibili.

Vedi anche Codifica Hash e Base64 MD5 e MD5 è 128 bit, ma perché sono 32 caratteri?

But what if there was a hashing functioned designed to take advantage of UTF-8? From what I understand there are roughly 100,000 possible values for each character.

Ancora una volta, l'hash è una stringa di bit - 128 nel caso di MD5, 256 nel caso di SHA-256. Se dovessi esprimere quei bit utilizzando UTF-8, la complessità dell'hash effettiva è esattamente la stessa, ma il numero di caratteri salirà effettivamente perché UTF-8 non è un formato di testo efficiente.

Also, I know that speed is very important in hashing functions. Would this be inherently slower than a Base64 hashing function?

La funzione di hashing rimarrebbe la stessa; solo la traduzione dell'hash binario in caratteri testuali cambierebbe, cosa che non avrebbe un impatto significativo sulla velocità.

I know that "bits of entropy" have a lot to do with the security of a password. Does this somehow improve those entropied bits? I'm pretty confused about entropy, to be honest.

Questo non ha nulla a che fare con questo. L'entropia ha a che fare con la crittografia, non con l'hashing, e il set di caratteri usato per esprimere un hash non ha comunque alcun impatto sull'hashing.

    
risposta data 03.09.2015 - 23:00
fonte
2

Non sono molto esperto in crypto ma penso che se guardi il risultato della funzione hash come un flusso di bit è lo stesso se lo "vedi" come una stringa UTF-8 o Base64 . Il modo in cui lo vedi potrebbe essere diverso ma il valore binario effettivo è lo stesso. Ma questa è solo un'ipotesi che ho fatto

    
risposta data 03.09.2015 - 22:54
fonte

Leggi altre domande sui tag