Password che si estende utilizzando la concatenazione degli hash

0

Sto lavorando a un semplice strumento di crittografia dei file.

Fondamentalmente, ecco come funziona il mio programma:

password = get_user_typed_password()
salt = uuid4()
key = bcrypt(password + salt)
cipher = AES(key)

for block in input_file:
    output_file.write(AES.encrypt(block))

La mia domanda riguarda "come potrei rendere una password possibilmente breve e debole una lunga e strong?".

Ho pensato che avrei potuto utilizzare una concatenazione dell'hash con sha512, in questo modo:

for i from 1 to 1000:
    password += sha512(password).digest()

Alla fine, avrei una password lunga 64000 con caratteri 'ANSII alti' come questi: ☼ ¢ ♣ ┌ ¥ ↕ ▼ ║ÅÕ¼ ■ ♫.

Pensi che sia una buona idea allungare la password fornita in questo modo? Ricorda che non sarà memorizzato in un db.

So che inventare il tuo meccanismo è sbagliato, ma qui, è solo per rendere la password più lunga / più strong ... la chiave finale sarà key = bcrypt (long_password + salt) comunque.

Con questa domanda, volevo chiederne una che non ho trovato qui: "La concatenazione hash è dannosa per la generazione di una chiave ... ma per quanto riguarda l'estensione della password?"

Grazie in anticipo per le tue risposte, spiegazioni e critiche (sono un novizio in crypto)!

    
posta SuperPython 20.01.2014 - 11:02
fonte

2 risposte

1

No, non penso sia una buona idea. Alla fine della giornata, il numero di possibili stati che l'output potrebbe avere è limitato al numero di possibili stati in cui può essere inserita la password di input. Quindi, se la password è lunga solo 5 caratteri, alfanumerica, quindi il numero di le uscite possibili saranno sempre 36 ^ 5, o circa 60 milioni. Non puoi creare l'entropia delle informazioni taggandolo - lo stai facendo sembrare più casuale, il che dà alle persone un falso senso di sicurezza.

Inoltre, stai inventando il tuo key-stretching che non è stato sottoposto a peer review. Esistono meccanismi di allungamento delle chiavi che sono stati opportunamente rivisti e che hanno dimostrato di essere almeno ragionevolmente forti. PBKDF2 è uno di questi algoritmi.

C'è anche un errore nel codice di crittografia:

for block in input_file:
    output_file.write(AES.encrypt(block))

Questa è una crittografia in modalità ECB (ogni blocco trasformato indipendentemente) che è noto per essere insicuro , anche se stai usando AES o qualsiasi altro codice a blocchi strong. Dovresti esaminare CBC o un'altra modalità di blocco che utilizza un IV.

Infine, non sembra che tu fornisca alcuna forma di record di autenticità nel tuo testo cifrato. Ciò significa che un utente malintenzionato può mescolare nuovamente i blocchi e modificare il testo in chiaro senza conoscere la chiave. Se si dovesse utilizzare la modalità CBC, questo problema non scompare: esiste un problema di malleabilità che consente a un utente malintenzionato di modificare un blocco di testo normale eliminando uno adiacente.

Il mio consiglio? Non usare questo in produzione. Devi studiare la crittografia per un po 'prima di provare a scrivere un'implementazione reale.

    
risposta data 20.01.2014 - 11:32
fonte
2

"Long" non rende "strong". Ciò che conta è entropy , una parola complicata che significa "ciò che la password avrebbe potuto essere". Una password debole è debole perché fa parte di una piccola serie di possibili password. L'attaccante è nella tua testa; quando selezioni una parola inglese comune cruda, sa che deve solo provare tutte le parole inglesi comuni; ce ne sono circa 10000.

Ora supponiamo di aver "allungato" la tua password. Quante password distinte distinte riesci a finire? Ancora 10000. L'hacker ha ancora solo 10000 password da provare per entrare nel tuo sistema. Lo stretching ha reso le password più lunghe ma non più forti perché l'entropia non è cambiata.

Nel migliore dei casi, puoi provare a rendere la ricerca di ogni attaccante più costosa possibile, e questo è il ruolo di bcrypt.

    
risposta data 20.01.2014 - 13:17
fonte

Leggi altre domande sui tag