Tengo un sistema que necesita enviar una clave al usuario. Esta clave se utiliza para la validación después del trabajo y debe mostrarse que no la cambiamos a mitad del trabajo, por lo que enviamos al usuario en medio del hash con SHA256 y, una vez finalizado el trabajo, enviamos la clave real y el clave hash para que pudiera comprobar si la clave era la misma.
La clave original es una cadena formada por 32 números hexadecimales entre 0x00
y 0xff
, por lo que las claves son así:
key: 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
hashed_key: e0bc614e4fd035a488619799853b075143deea596c477b8dc077e309c0fe42e9
key: d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
hashed_key: d8bdf9a0cb27a193a1127de2924b6e5a9e4c2d3b3fe42e935e160c011f3df1fc
Esto necesitará un máximo de 2 * 10^77
hashes para crackear usando fuerza bruta y es poco probable que alguien tenga suficiente espacio en HD para crear una base de datos para todas las claves posibles
La clave que construimos es probablemente un hash de otra cosa, por ejemplo, en los ejemplos son hashes a 1
y 2
respectivamente, pero podrían ser para cualquier otra cadena, usamos algunos números complejos y aleatorios (verdadero aleatorio) para generar nuevos hash seguros que es muy poco probable que se repitan.
¿Qué pasaría si seguimos aplicando SHA256 una y otra vez? en algún punto se daría vuelta?
¿Y dado que tenemos una clave de longitud fija para ser hash, sería más fácil de romper? ¿Hay algún otro método más eficiente para esto que la fuerza bruta?
Este sistema funciona con dinero (juegos de azar) y tuvimos algunos problemas con las "rachas de la suerte", así que estoy tratando de entender si realmente fue suerte. ¿O alguien rompió nuestro sistema?
EDITAR clarificación de contenido
Las computadoras no pueden crear secuencias aleatorias reales, dado que tiene los valores iniciales que podría recrear cualquier secuencia, esto es lo que usamos para garantizar la probabilidad. Cada usuario tiene en todo momento 3 claves de servidor y 2 claves de cliente:
- claves del servidor
- la clave antigua, utilizada en la ejecución anterior, revelada y presentada junto con un hash equivalente
- la clave actual, utilizada en la ejecución actual, oculta y solo hash presentado
- la siguiente clave, utilizada en la siguiente ejecución, oculta y solo hash presentado
- claves de cliente
- la clave antigua, utilizada en la ejecución anterior
- la clave actual, siendo utilizada
En cualquier ejecución dada, el número ganador se encuentra utilizando una función que calcula un número a partir de un hash generado con esta función hmac(server_key, current_bet_index + client_key)
Cuando el usuario cambia la clave de cliente, la clave del servidor también se cambia a la siguiente, y la anterior se revela y le da al usuario la oportunidad de revisar las apuestas anteriores.