J'ai besoin d'une fonction de hachage sécurisée (cryptographique) avec les propriétés suivantes: p>
La plupart des fonctions de hachage sécurisées que je peux trouver sont conçues avec une efficacité de la vitesse / de la mémoire à l'esprit et sont complexes à coder en conséquence. P>
Le candidat actuel est Mash-1 (ou Mash-2): manuel de l'application cryptographie. Google Books P>
merci. p>
EDIT: Merci à tous pour vos réponses jusqu'à présent. S'il vous plaît, pardonnez-moi si ce qui suit se détache comme impoli, je veux juste être clair. S'il vous plaît faire confiance à moi que j'ai fait mes devoirs et j'ai considéré les options "standard". Je sais que la chose la plus facile à faire est d'utiliser un de ceux-ci, mais ce n'est pas ce que je cherche. P>
La seule question que j'essaie de répondre est la suivante: Quel algorithme de hachage cryptographiquement sécurisé peut être mis en œuvre dans la plus petite quantité de code «lisible»? p>
J'ai déjà posté le meilleur candidat que je pouvais trouver. Toute suggestion sur quelque chose de plus simple ou de commentaires sur Mash-1/2 serait le plus utile. P>
5 Réponses :
Découvrez le Source Truecrypt . Ils mettent en œuvre plusieurs fonctions de hachage fortes. Juste l'avertissement standard, il est imprudent de modifier une implémentation existante ou pire encore, utilisez votre propre. Il va presque certainement injecter une faiblesse. Je me rends compte que vous ne faites pas cela ici, mais juste un clause de non-responsabilité. :) p>
Si vous souhaitez une fonction de hachage sécurisée dans le but de sécuriser quelque chose (par exemple, dans le cadre d'un algorithme de cryptage), vous seriez mieux servi à l'aide d'une implication de la bibliothèque de SHA-512 (ou peut-être de la RIPEMD-160 ou de quelques-unes Autres). P>
Si vous le souhaitez pour les mots de passe de hachage, je dirais qu'une fonction de hachage comme la purée correspondrait à la facture de résistance à la force brute (lorsqu'elle est utilisée avec un sel) et des tables d'arc-en-ciel. Je ne l'utiliserais toujours pas à moins d'avoir des exigences strictes interdisant ou excluais-moi d'utiliser une implation de la bibliothèque - mais cela ressemble à ce que vous n'ayez peut-être que ceux-ci. P>
Si vous le souhaitez pour quelque chose de moins sécurisé, dites une vérification de l'intégrité des fichiers, presque tout ce qui serait si vous êtes explicitement préoccupé par les utilisateurs malveillants générant des collisions. Dans ce cas, en fonction de la valeur de ce que vous protégeez, je vais aller de quelque chose de simple comme une cash à quelque chose de plus résistant à la SHA-512 ou à la RIPEMD-320. P>
Pour vos besoins, je vais vérifier le finalistes SHA-3 . p>
Si vous avez la primitive AES implémentée pour le cryptage, vous pouvez réutiliser que plusieurs des fonctions sont relativement simplement. P>
Sinon, je pense que j'irais avec Daniel Bernstein's Cubehash . Que l'on cherche à avoir une partie de cette "élégance simple" que vous cherchiez. P>
Merci. Cela ressemble à une possibilité intéressante.
Selon la section 18.12 de la "cryptographie appliquée" de Bruce Schneier: "Il est possible d'utiliser un algorithme de cryptage de clé publique dans un mode de chaîne de bloc comme une fonction de hachage à sens unique."
RSA (avec la clé privée étant supprimée) est répertorié comme exemple. La sécurité est aussi forte que RSA. P>
Étape de cryptage RSA est assez simple à mettre en œuvre. Surtout dans une langue qui a des entiers de taille arbitraire. p>
Les 2 mises en garde ÊTES: 1. De loin plus lent que la plupart (toutes) autres fonctions de hachage sécurisées. Ce qui va bien pour moi. 2. Si vous avez mal codé vos clés publiques dans le code, le monde aurait à faire confiance que vous avez rejeté vos données de clé privées. Ou créez leurs propres clés privées publiques. P>
Je posterai du code dès que j'ai un exemple de travail. P>
EDIT: Ici. 30 lignes. Simple. Sécurise. Edit 2: Ce que j'ai réellement inclus est une variante et peut ne pas fonctionner. Voir les commentaires ci-dessous cet article et surveillez les mises à jour. P>
; compute a^d mod n (define powmod (lambda (a d n) (cond ((= 0 d) 1) ((= 1 d) (modulo a n)) ((= 0 (modulo d 2)) (modulo (expt (powmod a (/ d 2) n) 2) n)) (else (modulo (* (powmod a 1 n) (powmod a (- d 1) n)) n))))) (define foldr (lambda (func end lst) (if (null? lst) end (func (car lst) (foldr func end (cdr lst)))))) ; something to turn a string into a number (define any-string->number (lambda (s) (foldr (lambda (a b) (+ a (* 256 b))) 0 (map char->integer (string->list s))))) ; some big primes (define p 325981479175658910158495167696993467513669112200235950741366213684181287869366665231) (define q 930416184994449450269535709442344346507738432154879695027334802205487824589832585453) ; hash turns a string into a number ; see discrete logarithms. the inverse of this is *hard* to compute ; http://en.wikipedia.org/wiki/Discrete_logarithm (define hash (lambda (s) (powmod (any-string->number s) p q)))
J'ai effectivement envisagé de suggérer que l'un, mais décidé contre elle. Un autre inconvénient est que la sortie est relativement grande: 128 octets si vous utilisez un module de 1024 bits. Également: rappelez-vous que vous devez diviser l'entrée en blocs et en chaîner les résultats (ou simplement échouer si l'entrée est plus grande que le module).
Aussi: Ce que vous avez mis en œuvre n'est ni RSA ni Diffie-Hellman. En fait, c'est plutôt trivial. Trouver une donnée (A ^ p mod q), p et q est facile. Le problème du logarithme discret consiste à trouver un (p ^ a mod q), p et q.
Merci rasmus. Vous avez été utile dans ce fil. Dans la même section de "cryptographie appliquée", expliquant l'utilisation de RSA, cette méthode est mentionnée. Je n'ai pas le livre avec moi pour le moment, mais je suis assez certain de cela. Je vais vérifier quand je rentrerai à la maison. Je vois comment ce n'est pas exactement le problème du logarithme discret. Mais dans RSA, nous avons toujours un message ^ e MOD N, où n est (P-1) (Q-1) (Q-1) pour certains prime P Q, et E est relativement amorce à n. Cela étant trivialement brisable ferait sembler que RSA est aussi aussi. Pouvez-vous me signaler dans la direction de l'algorithme qui brise cela?
Je suppose que c'est une sorte de problème de RSA. Je devrais le faire exactement comme le problème de la RSA. en.wikipedia.org/wiki/rsa_problem
Dans RSA, le module n'est pas un premier, ce qui signifie que nous ne pouvons pas appliquer des fermats peu théorème: A ^ (Q-1) = A (MOD Q). Pour trouver un de A ^ P MOD Q, utilisez d'abord le théorème restant chinois pour trouver X et Y afin que XP + Y (Q-1) = 1. Alors (a ^ p) ^ x = a ^ px = a ^ (1-y (q-1)) = A * (A ^ (q-1) ^ - y) = A (mod q).
Je vous en prie. D'ailleurs. Le petit théorème de Fermat dit qu'un ^ (q-1) = 1 (mod q), pas ce que j'ai écrit ci-dessus.
Si vous préférez la simplicité et la valeur pédagogique sur l'efficacité, alors le VSH Fonction de hachage pourrait être une option. Il est livré avec de forts arguments que VSH est une fonction de hachage résistante à la collision, bien que cette fonction manque d'autres propriétés (par exemple la pseudorandomness) que d'autres fonctions de hachage ont. P>
Cela semble être ce que j'ai cherché. J'ai donné au papier un écrémé et j'ai accepté votre réponse. Merci.
Faites-vous juste cela comme un exercice d'apprentissage parce que franchement, je ne ferais pas de confiance à l'autre côté des algorithmes communément connus.
Le problème que vous rencontrez est que personne ne soit prêt à mettre leur main sur leur cœur et à dire que "x est sécurisé" lorsque X est une primitive crypto peu étudiée. C'est parce que "sécurisé" signifie généralement "n'a pas encore été cassé, malgré une attention importante".
Vous devez vraiment clarifier vos exigences de sécurité: si vous ne choisissez pas l'un des algorithmes de hasch les plus courants, vous effectuez un compromis de sécurité, car il est beaucoup plus probable que cela a une faiblesse inconnue. "Secure" n'est pas une valeur binaire. Vous n'êtes pas disposé à utiliser SHA-512 car il est trop complexe pour mettre en œuvre. Aidez-nous donc à découvrir combien de sécurité vous êtes prêt à échanger pour une mise en œuvre plus facile. Vous recherchez simplement le la plupart i> Secure Hash qui peut être mis en œuvre dans 50 lignes de schéma? Même si cet algorithme est susceptible d'être brisé à l'intérieur, par exemple, 10 ans?
Je pose une pile Web qui doit être utilisée comme outil de pédagogique. Je ne veux pas omettre quoi que ce soit nécessaire (hachage de mot de passe), mais je veux m'assurer que tout est aussi simple que possible pour que toute personne qui étudie ait l'espoir de comprendre pleinement chaque composant. Certains algorithmes cryptographiques (RSA, Feistel Cyphers) ont une certaine élégance simple pour eux et j'espérais quelque chose de similaire dans un hachage sécurisé. Je dois travailler avec ce qui est disponible et l'intention de ce fil est de découvrir quelles sont mes options.
Le schéma n'a-t-il vraiment pas une mise en œuvre de SHA1?