Ho un sistema che deve inviare una chiave all'utente. Questa chiave viene utilizzata per la convalida dopo il lavoro e deve essere mostrato che non lo cambiamo a metà del lavoro, quindi inviamo all'utente nel mezzo del lavoro un hash usando SHA256 e, terminato il lavoro, inviamo la chiave reale e il tasto hash per poter verificare se la chiave era la stessa.
La chiave originale è una stringa composta da 32 numeri esadecimali tra 0x00
e 0xff
, quindi le chiavi sono come queste:
key: 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b
hashed_key: e0bc614e4fd035a488619799853b075143deea596c477b8dc077e309c0fe42e9
key: d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35
hashed_key: d8bdf9a0cb27a193a1127de2924b6e5a9e4c2d3b3fe42e935e160c011f3df1fc
Questo richiede un massimo di 2 * 10^77
di hash per craccare usando la forza bruta ed è improbabile che qualcuno abbia abbastanza spazio HD per creare un database per tutte le possibili chiavi
La chiave che costruiamo è probabilmente un hash di qualcos'altro, ad esempio negli esempi sono hash a 1
e 2
rispettivamente, ma potrebbero essere per qualsiasi altra stringa, usiamo alcuni numeri complessi e casuali (true casuale) per generare nuovi hash sicuri che è molto improbabile che possano ripetersi.
Cosa succederebbe se continuassimo ad applicare SHA256 ancora e ancora? ad un certo punto girerebbe intorno?
E dato che abbiamo una chiave a lunghezza fissa da sottoporre a hash, sarebbe più facile da rompere? C'è qualche altro metodo più efficiente per questo rispetto alla forza bruta?
Questo sistema funziona con il denaro (gioco d'azzardo) e abbiamo avuto alcuni problemi con "serie fortunate", quindi sto cercando di capire se è davvero una fortuna? o qualcuno ha rotto il nostro sistema?
EDIT cpast clarification
I computer non possono costruire sequenze casuali reali, dato che hai i valori iniziali che potresti ricreare qualsiasi sequenza, questo è quello che usiamo per garantire la provabilità. Ogni utente ha sempre 3 chiavi del server e 2 chiavi del client:
- chiavi del server
- la vecchia chiave, usata nella precedente esecuzione, rivelata e presentata insieme all'equivalente hash
- la chiave attuale, utilizzata nell'esecuzione corrente, nascosta e solo hash presentata
- la prossima chiave, utilizzata alla prossima esecuzione, nascosta e solo hash presentata
- chiavi del cliente
- la vecchia chiave, utilizzata nella precedente esecuzione
- la chiave attuale, utilizzata
In ogni corsa determinata viene trovato il numero vincente usando una funzione che calcola un numero da un hash generato con questa funzione hmac(server_key, current_bet_index + client_key)
Quando l'utente cambia la chiave client, anche la chiave del server viene cambiata a quella successiva e quella precedente viene rivelata dando all'utente la possibilità di controllare le vecchie scommesse.