Cómo aumentar el tiempo para un ataque de contraseña sin conexión

1

Estoy tratando de responder una pregunta de práctica del examen CASP.

¿Podría alguien comentar sobre las opciones a continuación con respecto a la lógica detrás de cada elemento? ¿Dónde está el error lógico detrás de cada declaración?

  

Una empresa de almacenamiento como servicio implementa tanto el cifrado en reposo como   así como el cifrado en tránsito de los datos de los clientes. La seguridad   administrador se preocupa por la seguridad general de la encriptada   Datos de clientes almacenados por los servidores de la empresa y que quieren el desarrollo.   equipo para implementar una solución que fortalezca la capacidad del cliente   Clave de encriptación.

     

Cuál de los siguientes, si se implementa, MÁS aumentará el tiempo que   ¿El ataque de contraseña sin conexión contra los datos de los clientes tomaría?

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))

fuente: varios bancos de preguntas de cram exámenes CASP

Esto es lo que sé:

1) SHA-256 o superior genera hashes realmente fuertes con una probabilidad de colisión muy baja. Es muy poco probable que se produzca una colisión.

2) Leí otro artículo, pero no concluyente con respecto a la opción de JavaScript:   enlace  descifrado

3) Este es mucho más articulado con respecto a las opciones para mejorar las alternativas: enlace

4) Encontré este ejemplo real del esquema de codificación SHA256 y también generando sal para hacerlo aún más seguro al derrotar tablas hash precomputadas. Luego lo ejecutaremos a través de la verificación de la contraseña para asegurarnos de que la contraseña se escribió correctamente:

// 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')
    
pregunta Morgi0no_Atman 10.09.2018 - 00:39
fuente

1 respuesta

6

Creo que estás pensando demasiado en la pregunta. No es necesario que entiendas el manejo correcto de las contraseñas para responder esto. Trabaja a través de cada flujo lógico.

A: hash recursivamente sha(key + password) 5000 times , por lo que esto aumenta el trabajo que alguien tiene que hacer para resolverlo en 5000. Trabajo = 5000

B: simplemente establece password con el mismo valor 10000 , por lo que es equivalente a solo password = sha256(key) , que es una función hash única. Trabajo = 1

C: la contraseña no está hash en absoluto, se deja en texto plano con hashes anexados al final. Esta es obviamente la peor respuesta posible. Trabajo = 0

D: esta es una función hash única con 2 pasos, por lo que es un poquito mejor que B, pero en realidad no. Trabajo = 1

    
respondido por el schroeder 10.09.2018 - 11:37
fuente

Lea otras preguntas en las etiquetas