L'hash SHA256 potrebbe sovrapporsi a un certo punto?

0

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
    1. la vecchia chiave, usata nella precedente esecuzione, rivelata e presentata insieme all'equivalente hash
    2. la chiave attuale, utilizzata nell'esecuzione corrente, nascosta e solo hash presentata
    3. la prossima chiave, utilizzata alla prossima esecuzione, nascosta e solo hash presentata
  • chiavi del cliente
    1. la vecchia chiave, utilizzata nella precedente esecuzione
    2. 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.

    
posta Nicos Karalis 22.02.2015 - 17:37
fonte

1 risposta

1

La mia migliore comprensione della tua domanda è:

Dato un hash, da una funzione di hashing nota, se applico l'hash a se stesso un numero qualsiasi di volte, dovrò mai ricevere lo stesso numero di nuovo?

In questo caso la risposta è "Probabilmente in un tempo molto, molto, molto, molto lungo a seconda esattamente quale algoritmo usi e come lo usi."

Una parola su multi-hashing

Ad ogni modo, in un contesto di password (che realizzo non è il tuo contesto) non vorresti semplicemente applicare lo stesso hash ancora e ancora ciecamente senza comprendere alcune ramificazioni più profonde. Nel caso delle password, si desidera una soluzione di hashing iterativa che aggiunge work per rallentare i cracker.

link

Il mio consiglio per te

Ai fini di un gioco di carte, potrebbe essere più semplice crittografare semplicemente le carte dei clienti, inviarle al server e inviare i risultati all'utente. Nel tuo sistema (a quanto ho capito) la logica relativa allo stato di vittoria viene condotta nel client, che può essere manipolata.

Invece, assicurati solo che ci sia una connessione sicura tra il client e il server e fai tutta la logica sul lato server. Forse complicate configurazioni di hashing per le scommesse online come questa sono state fatte prima dell'uso onnipresente di https.

Quello che penso tu stia cercando di fare

Penso che la ragione per cui fornisci al cliente l'hash sia in modo da poter fornire una qualche forma di garanzia che il gioco non sia truccato. Stai tentando di implementare qualcosa di simile al seguente:

link

Tuttavia, per ottenere questo risultato per un gioco come il poker, dovrai sviluppare un sistema crittografico complesso e verificato, che (pur garantendo l'equità del gioco a un teorico) potrebbe fare poco per assicurare l'equità all'utente non tecnico .

Se fornisci ulteriori informazioni su ciò che stai tentando di fare, farò del mio meglio per aggiornare la risposta.

    
risposta data 23.02.2015 - 05:05
fonte

Leggi altre domande sui tag