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