2010-11-30 38 views
-1

Quelle est la propriété MD5/SHA qui vous permet de les "mettre à jour"? Par exemple, si vous avez le hash pour "test" vous pouvez ajouter "case" pour obtenir le hash pour "testcase". J'aimerais lire un peu sur cette propriété, mais mes recherches n'aboutissent à rien ...MD5/SHA "mise à jour" propriété?

Répondre

1

EDIT: Ce n'est pas même théoriquement possible, en raison du rembourrage 1 bit je mentionne ci-dessous. En effet, md5("case", seed=md5("test")) == md5("test" + <1-bit> + "case"). Il n'y a aucun moyen d'utiliser md5("test") pour calculer de façon incrémentielle md5("test" + "case").

Ceci est théoriquement possible si vous concaténez des blocs de 512 bits. Cela ne fonctionnera pas pour ajouter "case" à "test", car la première exécution de la machine d'état est polluée par le remplissage utilisé pour transformer "case" en un morceau de 512 bits.

En outre, le remplissage n'est pas seulement un groupe de zéros. Le message est toujours d'abord rempli avec un bit, de sorte que "case" et "case \ 0" produisent différents hachages. Ainsi, vous ne pouvez pas compter sur "cas" ayant le même hachage avec ou sans rembourrage.

+0

Cela sera utilisé pour ajouter un sel aléatoire, de sorte que le bit supplémentaire ne fait pas de mal, tant qu'il est cohérent. Merci pour votre réponse! –

+0

@Stavros: Si vous n'avez jamais l'intention de calculer directement "testcase", cela n'a pas vraiment d'importance. Vous pouvez même calculer 'md5 (md5 (" test ") +" case ")', évitant ainsi le besoin d'écrire un md5 personnalisé qui prend un paramètre seed. –

2

C'est simplement qu'ils sont calculés de façon incrémentielle - vous les calculez en agissant sur les n premiers octets de données, (128 dans le cas de MD5, voir http://en.wikipedia.org/wiki/MD5#Algorithm), puis sur les n octets de données, etc.

+0

Sont-ils rembourrés? Est-ce que cela signifie que vous ne pouvez pas toujours ajouter quelques octets à votre hachage pour en obtenir un nouveau? Je me demande essentiellement s'il y a toujours un moyen d'ajouter Y au résumé pour X pour obtenir le résumé pour XY. –

+0

Cela ne fonctionnera pas pour "test" + "cas" en raison de la segmentation et du remplissage de 512 bits. –

+0

Je vois, merci. –

1

L'algorithme MD5 a les étapes suivantes:

1) pad input string to a multiple of 64 bytes 
2) split input string into blocks of 64 bytes 
3) initialise state (a 4-element array) 
4) for each block: state <= transform(state,block) 
5) encode state as string 

Pour soutenir les situations où vous voulez quelque chose de hachage par étapes (par exemple des fichiers volumineux), cela peut être refondus comme suit.

Initialiser:

1) initialise state 
2) leftover bytes <= "" 

Mise à jour:

1) append leftover bytes to start of input string 
2) split input string into blocks of 64 bytes 
3) for each complete block: state <= transform(state,block) 
4) leftover bytes <= contents of the incomplete block, if one exists 

Digest:

1) pad a copy of the leftover bytes 
2) split the padded leftover bytes into blocks of 64 bytes 
2) tmp_state <= state 
2) for each block: tmp_state <= transform(tmp_state,block) 
3) encode tmp_state as string 

J'ai effectivement mis en œuvre cette approche dans VBA - il semble fonctionner très bien. Des suggestions pour où je devrais télécharger le code?