give the attacker an advantage
Dipende. Cosa sta cercando di fare l'attaccante?
Dato che chiami una delle parti di dati coinvolte "password", presumo che l'obiettivo di chi effettua l'attacco sia trovare questa password e il tuo obiettivo è mantenerlo segreto.
Non è chiaro cosa intendi per AES.Encrypt(bytesToEncrypt, password)
. Suppongo che intendi che stai utilizzando una delle modalità di crittografia a blocchi standard utilizzando AES come codice a blocchi, con bytesToEncrypt
è la chiave e password
è il messaggio da crittografare, o forse il contrario. Qui sotto scriverò AES.Encrypt(key, message)
dove key
è la chiave di crittografia e message
è la stringa da cifrare, poiché questo è l'ordine degli argomenti usati praticamente in tutte le API là fuori.
Se si rivela SHA256.Hash(password)
, l'utente malintenzionato può trovare la password calcolando SHA256.Hash(p)
per molti valori di p
finché non ne trovano uno con un hash corrispondente. Possono fare i calcoli stessi o sfruttare i calcoli fatti da altri. Questo potrebbe essere devastante se l'hash è qualcosa come b9f195c5cc7ef6afadbfbc42892ad47d3b24c6bc94bb510c4564a90a14e8b799 , meno se è qualcosa come 3d5cfec95acbabf275d544e138fdfa02ad3945adc681dfa0cec75a127a9ff6aa , ma una minaccia realistica per qualsiasi password che sia memorabile.
Se rilevi AES.Encrypt(key, password)
per l'attaccante, l'attaccante può sapere due cose:
- Sapranno la lunghezza esatta o approssimativa della password, a seconda della modalità di crittografia che hai usato.
- Se l'autore dell'attacco riesce anche a ottenere
bytesToEncrypt
, allora conoscerà la password.
Se si desidera calcolare AES.Encrypt(password, message)
, si incorre nel problema che ciò non ha realmente senso. Una chiave AES deve essere una stringa di 16 byte, 24 byte o 32 byte. Non sono possibili altre lunghezze di stringa: l'algoritmo non è definito per altre lunghezze di stringa. Se si utilizza una password che ha la lunghezza di byte richiesta, è una pessima idea perché le chiavi dovrebbero essere generate casualmente. Se si utilizza una password composta da caratteri stampabili e con motivi che la rendono memorabile, non si utilizza AES nel modo in cui è stata progettata. Si apre la strada a attacchi con chiave correlata : è possibile imparare cose dalle relazioni tra le chiavi, come "questo la chiave consiste solo di caratteri ASCII "(cioè il bit più significativo di ogni byte è 0). AES ha conosciuto punti deboli contro gli attacchi con chiave correlata, il che non è un problema nella pratica perché nessun protocollo sano di mente coinvolge le chiavi correlate. Tuttavia, usare una password come chiave non è un protocollo sensato. Inoltre, stai ovviamente rivelando qualcosa sulla lunghezza della password e la stai esponendo allo stesso tipo di attacco a forza bruta del caso SHA-256 se è noto message
.
Trovare la password attraverso il suo hash e trovare la password attraverso la sua crittografia è praticamente indipendente. AES e SHA-256 sono disegni non correlati. Conoscere la crittografia rivela la dimensione e quindi rende più facile la ricerca di una password con un hash corrispondente, ma solo marginalmente. Conoscere l'hash non aiuta a rompere la crittografia, a meno di trovare effettivamente la password.
Rivelare o la crittografia o l'hash SHA-256 di una password è una pessima idea, poiché ognuna di esse ha evidenti debolezze (una si rompe se la chiave perde, l'altra è vulnerabile alla brutalità attacchi di forza). Le password dovrebbero essere archiviate solo sotto forma di hash lento e salato , e l'hash deve essere tenuto segreto per buona misura.
¹ In teoria non saprebbero se ciò che hanno trovato è la password effettiva o una stringa diversa con lo stesso hash. Tuttavia, non esiste un modo noto per trovare due stringhe con lo stesso hash SHA-256, e richiederebbe una ricerca di forza bruta in esecuzione su tutti i computer attualmente esistenti circa la vita dell'universo per avere una possibilità non trascurabile di trovarne uno .