Ich schreibe ein Login für ein Forum und muss das Passwort clientseitig in Javascript hashen, bevor ich es an den Server weiterleiten kann. Ich habe Probleme herauszufinden, welcher SHA-256-Implementierung ich tatsächlich vertrauen kann. Ich hatte erwartet, dass es eine Art maßgebliches Skript gibt, das jeder verwendet, aber ich finde viele verschiedene Projekte, alle mit ihren eigenen Implementierungen.
Mir ist klar, dass die Verwendung der Krypto anderer Leute immer ein Vertrauenssprung ist, es sei denn, Sie sind qualifiziert, sie selbst zu überprüfen, und dass es keine universelle Definition von "vertrauenswürdig" gibt, aber dies scheint etwas Gemeinsames und Wichtiges zu sein, das es geben sollte Konsens darüber, was zu verwenden ist. Bin ich nur naiv
Bearbeiten, da es in den Kommentaren häufig vorkommt: Ja, wir machen auf der Serverseite wieder einen strengeren Hash. Das clientseitige Hashing ist nicht das Endergebnis, das wir in der Datenbank speichern. Das clientseitige Hashing liegt daran, dass der menschliche Client es anfordert. Sie haben keinen bestimmten Grund angegeben, warum sie wahrscheinlich nur Overkill mögen.
quelle
Antworten:
Die Stanford JS Crypto Library enthält eine Implementierung von SHA-256. Während Krypto in JS nicht so gut geprüft ist wie andere Implementierungsplattformen, wird diese zumindest teilweise von Dan Boneh entwickelt und bis zu einem gewissen Grad von Dan Boneh gesponsert, einem etablierten und vertrauenswürdigen Namen in der Kryptographie und bedeutet, dass das Projekt von jemandem überwacht wird, der tatsächlich weiß, was er tut. Das Projekt wird auch von der NSF unterstützt .
Es ist jedoch darauf hinzuweisen,
dass, wenn Sie das Kennwort clientseitig hashen, bevor Sie es senden, der Hash das Kennwort ist und das ursprüngliche Kennwort irrelevant wird. Ein Angreifer muss nur den Hash abfangen, um sich als Benutzer auszugeben. Wenn dieser Hash unverändert auf dem Server gespeichert ist, speichert der Server das wahre Kennwort (den Hash) im Klartext .
Ihre Sicherheit ist jetzt schlechter, weil Sie beschlossen haben , Ihre eigenen Verbesserungen zu einem zuvor vertrauenswürdigen Schema hinzuzufügen .
quelle
Unter https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest habe ich dieses Snippet gefunden, das das interne js-Modul verwendet:
Beachten Sie, dass
crypto.subtle
in nur verfügbar fürhttps
oderlocalhost
- zum Beispiel für Ihre lokale Entwicklung mit -python3 -m http.server
Sie diese Zeile zu Ihrem hinzufügen müssen/etc/hosts
:0.0.0.0 localhost
Neustart - und Sie können
localhost:8000
mit der Arbeit öffnencrypto.subtle
.quelle
Die SHA-256-Implementierung von Forge ist schnell und zuverlässig.
Unter http://brillout.github.io/test-javascript-hash-implementations/ können Sie Tests für mehrere SHA-256-JavaScript-Implementierungen ausführen .
Die Ergebnisse auf meinem Computer deuten darauf hin, dass Forge die schnellste Implementierung ist und auch erheblich schneller als die in der akzeptierten Antwort erwähnte Stanford Javascript Crypto Library (sjcl).
Forge ist 256 KB groß, aber das Extrahieren des SHA-256-Codes reduziert die Größe auf 4,5 KB (siehe https://github.com/brillout/forge-sha256)
quelle
npm install node-forge
, aber jetzt, wie man die Bibliothek benutzt, erstellt man einen Hash aus der Zeichenfolgefoo
?Für Interessenten ist dies ein Code zum Erstellen von SHA-256-Hash mit
sjcl
:quelle
Nein, es gibt keine Möglichkeit, Browser-JavaScript zu verwenden, um die Kennwortsicherheit zu verbessern. Ich empfehle Ihnen dringend, diesen Artikel zu lesen . In Ihrem Fall ist das größte Problem das Hühnerei-Problem:
[...]
Was dazu führt:
Grundsätzlich ist das Problem folgendes:
Oder alternativ,
Hinweis: Außerdem ist SHA-256 dafür nicht geeignet, da es so einfach ist, ungesalzene, nicht iterierte Kennwörter brutal zu erzwingen . Wenn Sie sich trotzdem dazu entschließen, suchen Sie nach einer Implementierung von bcrypt , scrypt oder PBKDF2 .
quelle
Ich fand diese Implementierung sehr einfach zu bedienen. Hat auch eine großzügige BSD-Lizenz:
jsSHA: https://github.com/Caligatio/jsSHA
Ich brauchte einen schnellen Weg, um die Hex-String-Darstellung eines SHA-256-Hash zu erhalten. Es dauerte nur 3 Zeilen:
quelle
Neben der Stanford Lib, die Tyler erwähnte. Ich fand jsrsasign sehr nützlich (Github-Repo hier: https://github.com/kjur/jsrsasign ). Ich weiß nicht, wie genau es vertrauenswürdig ist, aber ich habe die API von SHA256, Base64, RSA, x509 usw. verwendet und es funktioniert ziemlich gut. Tatsächlich enthält es auch die Stanford-Bibliothek.
Wenn Sie nur SHA256 tun möchten, ist jsrsasign möglicherweise ein Overkill. Aber wenn Sie andere Bedürfnisse in dem verwandten Bereich haben, denke ich, dass es eine gute Passform ist.
quelle