è possibile estrarre un "hint hint" di qualche tipo da un altro hash?

5

Sono uno sviluppatore web che inizia a immergermi nella crittografia, quindi ti prego di scoprire con me su questo ...

Diciamo che ho una collezione di hash che sono stati generati da alcuni dati comuni, cioè modifiche a più record. C'è un modo per generare un hash secondario dall'hash principale e confrontarlo con gli altri hash in base a come è stato generato l'hash principale. Ad esempio ...

plain text             | hash      | hint hash
----------------------------------------------
"USER:123:fName:Alice" | 92eb5ff.. | 3cd24
"USER:123:fName:alice!"| 1c77753.. | 3cd24
"USER:456:fName:Bob"   | fee6ae2.. | 7d28e
"USER:456:fName:bob!"  | 7775315.. | 7d28e
"USER:789:fName:Carl"  | fec3ad7.. | 75315

Si noti come tutti gli hash siano univoci, ma gli hash del suggerimento corrispondono agli ID dei record da cui è stato eseguito l'hash. Quindi, se ho generato questi hash basati sul testo semplice e su una chiave, ad esempio genHash (plainText, keyText). Se disponi solo degli hash, puoi associare gli hash correlati tra loro solo con gli hash del suggerimento. Quindi, se avessi solo gli hash, potrei ancora trovare le loro associazioni con un paio di chiamate getHintHash (hash) ...

Tabella degli hash:

hash      
---------
92eb5ff.. 
1c77753..
fee6ae2..
7775315.. 
fec3ad7..

Tabella degli hash con gli hint hash:

hash      | hint hash
----------------------
92eb5ff.. | 3cd24
1c77753.. | 3cd24
fee6ae2.. | 7d28e
7775315.. | 7d28e
fec3ad7.. | 75315

Ora ho le relazioni tra gli hash univoci senza esporre il testo in chiaro che li ha generati. È possibile? Ricorda, la funzione di hashing ha ottenuto il testo in chiaro e una chiave che potrebbe essere basata su "hint hint" al di fuori di ...

genHash("USER:123:fName:Alice", "USER:123") -> 92eb5ff..
    
posta dirtdevil 03.09.2016 - 00:43
fonte

2 risposte

2

Vuoi uno schema in cui, dati solo i valori hash, puoi calcolare se due hash si riferiscono allo stesso utente o meno. Questa è una domanda piuttosto complessa, quindi ha una risposta piuttosto complessa. Per prima cosa, assicuriamoci di essere tutti d'accordo sui termini:

Def'n: Hash :

A hash function is any function that can be used to map data of arbitrary size to data of fixed size. [wikipedia/Hash_Function]

Ad esempio, le iniziali sono una funzione di hash perfettamente valida ( John Smith --> JS , Christina Secretmessagewriter --> CS ), anche se non va bene per la crittografia perché non fa molto in termini di occultamento.

Def'n Crashographic Hash :

A cryptographic hash function is a mathematical algorithm that maps data of arbitrary size to a bit string of a fixed size (a hash function) which is designed to also be one-way function, that is, a function which is infeasible to invert. [wikipedia/Cryptographic_Hash_Function]

Se fai clic su "funzione unidirezionale" e vai abbastanza lontano nella tana del coniglio, scoprirai che gli hash crittografici devono essere indistinguibili casualmente, il che significa che se ti ho dato due hash, non c'è modo di ottenere qualsiasi tipo di informazione sul fatto che i due input siano correlati (un altro termine che si può dire per questo è "effetto valanga").

Quindi, per definizione, ciò che desideri è in contrasto con l'idea stessa di una funzione hash crittografica, il cui scopo è di impedire qualsiasi perdita di informazioni.

A seconda di quanto ti preoccupi della perdita di informazioni, la risposta può andare avanti.

Quello che stai chiedendo è di incorporare il suggerimento di hash all'interno dell'hash generale in modo che possa essere estratto di nuovo. Non c'è una vera sicurezza qui perché se puoi farlo, così può un attaccante che conosce il tuo sistema, ma esploriamolo comunque.

Un modo per ottenere ciò sarebbe hash le parti USER:123 e fName:Alice separatamente e concatenarle per creare il tuo hash globale. Il tuo "suggerimento hash" è solo la prima metà dell'hash generale (o i primi N caratteri se usi hash di dimensioni diverse). Soddisfa il requisito che getHintHash(hash) estrae l'hash hint dall'hash generale e ti consente di correggere insieme il record correlato senza esporre il testo in chiaro.

Potresti fare qualcosa di più complesso inventando la tua funzione hash non crittografica che diffonde il suggerimento sul massaggio piuttosto che attaccarlo sul davanti (magari attraverso una matematica intelligente o usando un trucco del stenography un sacco di trucchi), ma non è chiaro cosa ti guadagna.

Alla fine della giornata potresti guadagnare qualche sicurezza attraverso l'oscurità e potresti essere in grado di comprimere il tuo hash è un po 'più piccolo, ma è davvero equivalente alla concatenazione di due hash.

    
risposta data 03.09.2016 - 01:35
fonte
1

Non sono chiaro dal tuo post se GetHintHash è un'operazione di recupero dei dati o una pura funzione di calcolo.

Se stai chiedendo, "Posso progettare un sistema di archiviazione dati che includa gli hint di hashing che possono essere recuperati dalla memoria tramite una funzione denominata GetHintHash(hash) che consentirà di recuperare i record correlati?" allora sì, ovviamente, hai appena descritto un sistema del genere.

Se stai chiedendo, "Posso scrivere una funzione che mi dirà se due hash sono derivati da un testo in chiaro simile, dato nessun altro dato oltre ai due hash?" La risposta è NO , a meno che la tua funzione hash non risulti corretta. Stai chiedendo il contrario del proiettile in grassetto qui sotto:

The ideal cryptographic hash function has four main properties:

  • it is quick to compute the hash value for any given message

  • it is infeasible to generate a message from its hash value except by trying all possible messages

  • a small change to a message should change the hash value so extensively that the new hash value appears uncorrelated with the old hash value

  • it is infeasible to find two different messages with the same hash value

(fonte: Wikipedia )

    
risposta data 03.09.2016 - 01:36
fonte

Leggi altre domande sui tag