Come aumentare il tempo per un attacco di password offline

1

Sto tentando di rispondere a una domanda di pratica sugli esami CASP.

Qualcuno potrebbe commentare le opzioni sottostanti riguardo alla logica dietro ogni oggetto? Dov'è l'errore logico dietro ogni affermazione?

A Storage-as-a-Service company implements both encryption at rest as well as encryption in transit of customers’ data. The security administrator is concerned with the overall security of the encrypted customer data stored by the company servers and wants the development team to implement a solution that will strengthen the customer’s encryption key.

Which of the following, if implemented, will MOST increase the time an offline password attack against the customers’ data would take?

A.
key = NULL ; for (int i=0; i<5000; i++) { **key = sha(key + password)** }

B.
password = NULL ; for (int i=0; i<10000; i++) { password = sha256(key) }

C.
password = password + sha(password+salt) + aes256(password+salt)

D.
key = aes128(sha256(password), password))

fonte: varie banche di domande per l'esame CASP

Questo è quello che so:

1) SHA-256 o superiore genera hash veramente forti con una probabilità di collisione molto bassa. È altamente improbabile che si verifichi una collisione.

2) Ho letto un altro articolo, ma non conclusivo riguardo all'opzione JavaScript:   link  decifratura

3) Questo è molto più articolato riguardo alle opzioni per migliorare le alternative: link

4) Ho trovato questo vero esempio dello schema di codifica SHA256 e anche di generare un salt per renderlo ancora più sicuro sconfiggendo le tabelle hash precalcolate. Lo eseguiremo quindi attraverso il controllo delle password per garantire che la password sia stata digitata correttamente:

// From Python: Penetration Testing for Developers

#!/usr/bin/python
import uuid
import hashlib

# Let's do the hashing. We create a salt and append it to the password once hashes.

def hash(password):
    salt = uuid.uuid4().hex
    return hashlib.sha512(salt.encode() + password.encode()).hexdigest() + ':' + salt

# Let's confirm that worked as intended.

def check(hashed, p2):
    password, salt = hashed.split(':')
    return password == hashlib.sha512(salt.encode() + p2.encode()).hexdigest()

password = raw_input('Please enter a password: ')
hashed = hash(password)
print('The string to store in the db is: ' + hashed)
re = raw_input('Please re-enter your password: ')

# Let's ensure the passwords matched

if check(hashed, re):
    print('Password Match')
else:
    print('Password Mismatch')
    
posta Morgi0no_Atman 10.09.2018 - 00:39
fonte

1 risposta

6

Penso che tu stia pensando troppo alla domanda. Non è necessario comprendere la corretta gestione della password per rispondere a questo. Lavora attraverso ogni flusso logico.

A: Hai hash ricorsivamente sha(key + password) 5000 times , quindi questo aumenta il lavoro che qualcuno deve fare per craccarlo di 5000. Lavoro = 5000

B: hai appena impostato password sullo stesso valore 10000 volte, quindi è equivalente a solo password = sha256(key) che è una singola funzione di hash. Lavoro = 1

C: la password non è affatto hash, viene lasciata in chiaro con gli hash aggiunti alla fine. Questa è ovviamente la risposta peggiore possibile. Lavoro = 0

D: Questa è una singola funzione di hash con 2 passaggi, quindi è leggermente migliore di B, ma non proprio. Lavoro = 1

    
risposta data 10.09.2018 - 11:37
fonte

Leggi altre domande sui tag