Y a-SHA-256 javascript implémentations qui sont généralement considéré comme digne de confiance?
Je suis en train d'écrire une connexion pour un forum, et le besoin de hacher le mot de passe côté client en javascript avant de l'envoyer sur le serveur. Je vais avoir de la difficulté à décider de l'algorithme SHA-256 de la mise en œuvre, je peux réellement confiance. Je m'attendais à y avoir une sorte d'autorité de script utilisé par tous, mais je suis la recherche charge de différents projets, tous avec leurs propres implémentations.
Je me rends compte à l'aide d'autres personnes crypto est toujours un acte de foi, sauf si vous êtes qualifié pour examiner vous-même, et qu'il n'existe pas de définition universelle de la "confiance", mais cela semble être quelque chose de commun et assez important qu'il doit y avoir une sorte de consensus sur ce qu'il faut utiliser. Suis-je naïf?
Modifier puisqu'il revient beaucoup dans les commentaires: Oui, nous faisons des mesures plus strictes de hachage de nouveau sur le côté serveur. Le côté client de hachage n'est pas le résultat final que nous enregistrer dans la base de données. Le côté client de hachage est parce que l'humain client le demande. Ils n'ont pas donné une raison précise pour laquelle, probablement, ils ont juste comme overkill.
- Si un script produit le même hachages que l'implémentation de référence sur votre serveur, qu'est-ce que vous recherchez?
- Si la vérification cohérent hachages est la seule chose que vous devez valider un algorithme de hachage puis, cette question est un peu idiote, oui. J'ai juste pensé qu'il y avait peut-être, potentiellement, d'autres choses qui pourraient mal tourner avec un mal écrit l'algorithme SHA que juste l'incohérence des résultats? Après que tout le monde me dit de ne jamais, jamais, jamais essayer de rouler ma propre initiative, j'ai juste cru qu'il y aurait plus à lui
- De ne pas m'éloigner du sujet, mais pourquoi êtes-vous le hachage du mot de passe sur le côté client?
- crypto "ne roulent pas vos propres" s'applique principalement à inventer votre propre algorithme. Pour bien connue des algorithmes de "pourquoi" est la principale raison. De mauvaises implémentations seront éliminées assez rapidement.
- Le client (l'humain) veut-il de cette façon. Nous utilisons le protocole https, mais ils préfèrent le mot de passe n'est jamais en clair n'importe où sauf sur la fin. Nous utilisons les meilleurs algorithmes de hachage sur le côté serveur
- Même pas proche. "Ne roulent pas vos propres" s'applique à inventer votre propre algorithme, la rédaction de votre propre mise en œuvre d'un algorithme, le développement de votre propre protocole sur le dessus des algorithmes de chiffrement, ou à peu près rien au-dessus de l'aide en tant que haut-niveau d'abstraction disponible. Si vous pensez que vous serez sûr de coller à une sécurité de base, et n'écrivant colle le code, tu vas passer un mauvais moment.
- si vous utilisez un mot de passe haché sans un protocole de stimulation/réponse, puis le hachage de mot de passe EST le mot de passe et c'est vraiment la même que la transmission du mot de passe en texte clair.
- Il est utile dans la protection de l'utilisateur mot de passe en clair pour tous les autres sites, ils pourraient l'utiliser, si ce n'est pour notre site en particulier. C'est une solution facile qui peut-être ne nous aideront pas, mais peut éventuellement aider à l'utilisateur si nous bousiller quelque part. Et comme je l'ai dit, la demande du client, je ne peux rien faire à ce sujet, même si je le voulais.
- Je sais que cela ne va pas changer votre esprit du client, ou votre esprit, mais je peux vous dire que de nombreuses fois au cours d'une plume de test, j'ai été en mesure de pivoter de manière beaucoup plus efficace que je pourrais l'avoir, autrement, en étant capable d'utiliser directement un admin de hachage de mot de passe, j'ai obtenu à partir d'un web serveur de base de données pour gagner des privilèges d'administrateur dans l'application web et télécharger un shell pour plus de pivotement. Les mots de passe étaient en fait assez bonne et aurait pris moi un moment de craquer, mais depuis que j'ai pu utiliser le hachage directement il n'y a essentiellement pas de barrière entre l'injection SQL -> shell local.
- Je suis plus qu'ouvert à avoir mon esprit a changé 🙂 mais dans ce cas, je ne comprends pas vraiment comment votre point s'applique. Nous hash le mot de passe deux fois: une fois sur le côté client avec un simple SHA-256, et une fois sur le côté serveur avec quelque chose de plus exigeant. La première de protéger le texte en clair dans le cas de MITM ou similaire, et le deuxième pour la brute de protection. Même si vous avez obtenu une prise de la base de données et l'admin de hachage, vous ne pouviez pas utiliser directement pour valider la connexion.
- Sur le sujet de client-côté hachage de mot de passe, reportez-vous à côté Client hachage de mot de passe. Pour le bien c'est le cas, utilisez rot13 sur le côté client et un mot de passe correct algorithme de hachage (PBKDF2 ou bcrypt ou scrypt, accepter aucun substitut) sur le serveur.
- Ah, depuis que vous êtes de hachage dans les deux endroits, alors oui, mon point est discutable. Je ne savais pas que tu faisais de hachage sur le serveur-côté.
- C'est exactement ce que nous faisons. Ma propre justification pour le hachage côté client est de protéger l'utilisateur en clair (où ils pourraient utiliser d'ailleurs) dans le cas d'un MITM. Oui, https fait un meilleur travail, mais côté client de hachage n'est pas une chose difficile à mettre en œuvre et est seulement de manière partielle, de contrôle des dommages dans le cas où le https n'est pas correctement configuré. Est-il quelque chose de mal avec ce raisonnement que je suis absent? Ou faites-vous tout à fait en désaccord que ça en vaut la peine?
- Un rapide de hachage n'est pas de protéger le mot de passe utilisateur, s'il est obtenu à partir d'un dump de la base ou de l'écoute clandestine sur le fil.
- Il fait si c'est un mot de passe fort. Je ne tiens pas faire d'illusions, que c'est une parfaite défense contre tous les agresseurs, mais il est facile de défense contre certains attaquants. L'atténuation des dommages sur le dessus de meilleures pratiques, pas les délires d'un nouveau calcul de conception sécurisée.
- Il ne peut aider, au moins lorsqu'utilisé en combinaison avec une lenteur de hachage sur le serveur.
- Il ne pourrait pas l'aider si elle donne un faux sentiment de sécurité. Si un SHA-2, de votre mot de passe est une fuite, vous devez le traiter comme une fuite de votre mot de passe de toute façon. Une lente hachage ne peut que l'aider si elle est correctement mis en œuvre (et la complexité est intrinsèquement préjudiciable à la sécurité).
- Si vous tombez sur cette question, parce que vous êtes à la recherche d'un rapide et compact, SHA-256 de la mise en œuvre puis voir cette question: stackoverflow.com/questions/31219009/...
Vous devez vous connecter pour publier un commentaire.
La Stanford JS Bibliothèque Crypto contient une implémentation de l'algorithme SHA-256. Alors que la crypto en JS n'est pas vraiment aussi bien dans son intégralité, un effort que les autres de la mise en œuvre des plates-formes, celui-ci est au moins partiellement développées par et dans une certaine mesure, parrainé par Dan Boneh, qui est bien établie et le nom de confiance dans la cryptographie, et signifie que le projet a une certaine surveillance par quelqu'un qui sait vraiment ce qu'il fait. Le projet est également soutenu par le NSF.
Il est intéressant de souligner, cependant...
... si vous hachage du mot de passe de client-côté avant de l'envoyer, puis le de hachage est le mot de passe, et le mot de passe d'origine est plus pertinent. Un attaquant a besoin seulement d'intercepter le hachage afin d'usurper l'identité de l'utilisateur, et si le hachage est stocké non modifié sur le serveur, le serveur est le stockage de l' vrai mot de passe (le hash) en texte brut.
De sorte que votre sécurité est maintenant pire parce que vous avez décidé de ajouter vos propres améliorations à ce qui était auparavant une confiance régime.
Sur https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest j'ai trouvé ce bout de code utilise en interne le js module:
Noter que
crypto.subtle
en seulement disponible surhttps
oulocalhost
- par exemple pour votre développement local avecpython3 -m http.server
vous devez ajouter cette ligne à votre/etc/hosts
:0.0.0.0 localhost
De redémarrage, et vous pouvez ouvrir
localhost:8000
avec le travailcrypto.subtle
.Forges'SHA-256 de la mise en œuvre est rapide et fiable.
Exécuter des tests sur plusieurs SHA-256 implémentations JavaScript, allez à la http://brillout.github.io/test-javascript-hash-implementations/.
Les résultats sur ma machine suggère forge pour être le plus rapide de la mise en œuvre et aussi beaucoup plus rapide que la Stanford Javascript Bibliothèque Crypto (sjcl) mentionné dans la accepté de répondre.
Forge est de 256 KO gros, mais l'extraction de l'algorithme SHA-256 liées code réduit la taille de 4.5 KO, voir https://github.com/brillout/forge-sha256
npm install node-forge
, mais maintenant, comment utiliser la bibliothèque n'créer un hachage de la chaînefoo
?Non, il n'y a pas moyen d'utiliser le navigateur JavaScript pour améliorer la sécurité de mot de passe. Je vous recommande vivement de lire cet article. Dans votre cas, le plus gros problème est le poulet oeuf problème:
[...]
Qui conduit à ceci:
Fondamentalement, le problème est: est-ce
Ou sinon,
Remarque: en outre, SHA-256 n'est pas adapté pour cela, puisque c'est si facile à la force brute non salé non itéré des mots de passe. Si vous décidez de le faire de toute façon, regardez pour une mise en œuvre de bcrypt, scrypt ou PBKDF2.
J'ai trouvé cette mise en œuvre très facile à utiliser. Dispose également d'un généreux licence de type BSD:
jsSHA: https://github.com/Caligatio/jsSHA
J'ai besoin d'un moyen rapide pour obtenir le hex-string représentation d'un hachage SHA-256. Il n'a fallu que 3 lignes:
Pour ceux qui sont intéressés, c'est le code pour la création de hachage SHA-256 à l'aide de
sjcl
:En plus de la Stanford lib qui tylerl mentionné. J'ai trouvé jsrsasign très utile (dépôt Github ici:https://github.com/kjur/jsrsasign). Je ne sais pas exactement comment digne de confiance, il est, mais j'ai utilisé son API de SHA256, Base64, RSA, x509, etc. et ça marche plutôt bien. En fait, il inclut la Stanford lib ainsi.
Si tout ce que vous voulez faire est de SHA256, jsrsasign peut-être exagéré. Mais si vous avez d'autres besoins dans le domaine, je pense que c'est un bon ajustement.