JavaScript Lokal Hashen mit Crypto-js

_CH_K_1991_

Lieutenant
Registriert
Nov. 2008
Beiträge
770
Lösung bei Post 18 LINK

Hallo zusammen

Ich möchte gerne Passwörter vor dem senden im Browser hashen.

Dazu habe ich im Internet folgendes gefunden:
http://code.google.com/p/crypto-js

Damit das einlesen mit require funktioniert habe ich noch folgende Lib eingebunden:
http://github.com/jrburke/requirejs

Folgender Test Code habe ich für mich nun geschrieben:
Code:
<!DOCTYPE html>
<html>
<head>
 <title></title>
 <!-- Einbinden des Requirejs -->
 <script src="r.js"></script>
</head>
<body>
TEST->>
<script>
 document.write("next step ->> ");
 require(["crypto-js", "components/sha3"], function (CryptoJS, sha3) {
     document.write(CryptoJS.sha3("Message"));
 });
 document.write("->> exit <<-");
</script>
</body>
</html>

Die Firefox Konsole gibt mir folgende, meiner Meinung nach relevanten Fehler zurück:

ReferenceError: CryptoJS is not
Error: Load timeout for modules: components/sha3
http://requirejs.org/docs/errors.html#timeout

Zur Info: Alle Files liegen auf dem Desktop, die File sha3.js liegt im components Ordner.

Jetzt funktioniert dies aber überhaupt nicht so wie ich mir das vorgestellt habe und leider habe ich kein wirklich anderes Tutorial oder sonstige Quelle gefunden die mir hier weiterhelfen könnte.
Hat jemand von euch Crypto-js order requirejs benützt? Könntet ihr mir weiterhelfen?

Danke vielmals
Gruss Matthias
 
Zuletzt bearbeitet:
Schlechte Idee. Lass den Server hashen. Sonst bekommt ein Angreifer das Salt geschenkt, oder noch schlimmer, es wird gar keins benutzt.

Siehe auch: https://crackstation.net/hashing-security.htm

The problem is that the client-side hash logically*becomes*the user's password. All the user needs to do to authenticate is tell the server the hash of their password. If a bad guy got a user's*hash*they could use it to authenticate to the server, without knowing the user's password! So, if the bad guy somehow steals the database of hashes from this hypothetical website, they'll have immediate access to everyone's accounts without having to guess any passwords.
 
Zuletzt bearbeitet:
andere Frage: Was erhoffst du dir dadurch? Und wie sieht dein genauer Ablauf aus, wie du es umsetzen willst?
 
Danke für die Antworten.
Ich würde nach dem Absenden des Formulars das Passwort einmal hashen (weiss noch nicht welchen hash - gibt ja viele Möglichkeiten mit Crypto-js) dann wird das Passwort "verschlüsselt" übertragen und kann auch bei geknackter HTTPS Verbindung nicht sofort ausgelesen werden.
Auf dem Server wird dann über den gesendeten Hash sicherheitshalber nochmals einer mit einem geheimen Salt darüber gejagt, damit der Hash aus der Connection nicht der gleiche ist wie der Hash in der Datenbank.

ice-breaker -> reicht das als Erklärung? ;-)
Ergänzung ()

@Sneazel
Mache ich doch oder nicht?
siehe Zeile 12
https://github.com/evanvosberg/crypto-js
 
Furchtbar! Es gibt wesentlich klügere Menschen, als mich oder dich, die sich darüber Gedanken gemacht haben und deshalb gibt es bewährte beste Praktiken mit gewissen Sicherheitsgarantien. Sich selbst etwas zusammenzufrickeln ist ein Garant für einen Totalschaden. Auch, wenn du denkst, da kann doch gar nichts passieren: Du bist kein Experte für Kryptographie (denn sonst würdest du diese Frage nicht stellen) und selbst echte Experten sind oft genug auf die Schnauze gefallen. Bitte, bitte, bitte, mach es vernünftig. Niemals Krypto selber basteln! Und das schließt natürlich Protokolle mit ein.

€: Ein Beispiel für ein Problem mit deiner Idee: Zweimal hashen ist allerhöchstens so sicher, wie einmal hashen, normalerweise weniger. Siehe auch Birthday attack.
 
Zuletzt bearbeitet:
Hi,

du hast dadurch doch nicht mehr Sicherheit!? Ob der Server das Passwort oder einen Hash davon entgegen nimmt spielt keine Rolle. Die Übertragung muss gesichert sein, alles andere ist nix. Klar, der "Böse" kann das Passwort nicht mehr zurückrechnen - sppielt aber keine Rolle, da das Originalpasswort auch gar nicht nötig ist, sieht der Server ja auch nie!

Und wie asdfman schon schreibt: Bei Krypto und Security keine eigene Suppe kochen!

VG,
Mad
 
Danke auch für eure Ratschläge.
Das mit dem selber Kochen verstehe ich ja, bin auch der gleichen Meinung -> aber nur zu meinem Verständnis, was bastle ich den selber zusammen? Möchte ja nur eine Krypto Lib von Google verwenden.

@Madman
Wie du richtig erkannt hast, ist einfach das Ziel, dass der "Böse" das PW nicht sieht falls die HTTPS Verbindung geknackt wird. Derm Server ist das Logischerweise egal, denn der sieht - wie du ja auch schon gesagt hast - das PW nur in Hash Form.
Auf dem Server hashe ich das dort eintreffende PW (sei es jetzt als Hash oder als Plaintext PW) so oder so mehrfach und mit Salt.

Danke :)
Gruss
 
*facepalm* Der lokale Hash wird dann das Passwort und denn sieht der Böse ja, wenn er HTTPS geknackt hat.
 
Hi,

Wie du richtig erkannt hast, ist einfach das Ziel, dass der "Böse" das PW nicht sieht falls die HTTPS Verbindung geknackt wird. Derm Server ist das Logischerweise egal, denn der sieht - wie du ja auch schon gesagt hast - das PW nur in Hash Form.

Und was genau bringt es dir dann? Sicherheitstechnisch null!

VG,
Mad
 
gut das stimmt natürlich auch wieder. Ich habe nur soweit überlegt, dass er das PW das er ausliest auf der Website wieder eigeben könnte. Aber wenn er HTTPS knacken kann kann er logischerweise auch einen gefakten Request abschicken :freaky: sry

Noch eine Frage: Wie sieht es denn aus, wenn man AES Verschlüsselt im Client. Man braucht ja einen Schlüssel um zu Verschlüsseln und Entschlüsseln. Wie funktioniert das hier?

Danke für die Geduld ;-)
Ergänzung ()

@Harzerkas - Als ich deinen Beitag das zweite Mal durchlas, musste ich irgendwie vollgas lachen :D Manchmal denke ich mir schon urkomische Dinge aus :p
 
_CH_K_1991_ schrieb:
Noch eine Frage: Wie sieht es denn aus, wenn man AES Verschlüsselt im Client. Man braucht ja einen Schlüssel um zu Verschlüsseln und Entschlüsseln. Wie funktioniert das hier?

Man macht vorher einen Schlüsselaustausch. Das Standardverfahren nennt sich Diffie-Hellman. Und nein, implementier das nicht nach. SSL/TLS ist eine Katastrophe, ja. Aber das Beste, was wir haben und besser, als alles, was ich oder du stricken könnten. Dann sollte man es auch benutzen.
 
okee, Danke für die Info.
Ergänzung ()

Falls es doch jemand interessiert:

Code:
<html>
    <head>
        <script src="[URL]http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha3.js"></script[/URL]>
        <script>
        function testScript(){
                   var hash = CryptoJS.SHA3(document.getElementById("theinput").value);
                   alert(hash);
        }
        </script>
    </head>
    <body>
        <label>input:</label><br>
        <input type="text" id="theinput">
        <button onclick="testScript()">hash me!</button>
    </body>
</html>
 
Wenn du das über eine gesicherte Verbindung aufrufen willst (und da es hier um crypto etc. geht gehe ich mal stark davon aus, dass du das willst...), gibt es nen mixed content warning.
googlecode unterstützt https, also verlinke es auch richtig.
 
Danke, Ja ich habe mir einfach auch dabei gedacht, dass wenn der Angreifer die Logindaten "erbeutet", sich zwar bei mir einloggen kann, aber auf anderen Websiten die Logindaten nicht durchprobieren kann.
 
Nur noch kurz als Info für andere, welche ebenfalls über Javascript hashen möchten:

HTML:
<script src="//crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha3.js"></script>
<script>
     hash = "";
     function pwdscript(){
          var hash = CryptoJS.SHA3(document.getElementById("passwordinput").value);
          document.getElementById("passwordinput").value = hash;
     }
</script>​
Das kommt in den Head-Bereich der Website.

HTML:
<form action="login.php" method="post">
     <br><h3>Login</h3>
     <hr>
     <div><input type="text" name="username" placeholder="Benutzername" required></div>
     <div><input id="passwordinput" type="password" name="password" placeholder="Passwort" required></div>
     <div><button type="submit" onclick="pwdscript()">Anmelden</button></div>
</form>
Das könnte dann ein mögliches Formular sein.

Gruss
 
Zuletzt bearbeitet: (Kleine Anpassung am Code -> Fehler ausgebessert)
Geht ja nur um den Basis Code. Ob du jetzt das ganze noch salzen willst oder nicht ist des Anwenders Sorge.
Sollte ja nicht allzu schwer sein...
Und dennoch ist ein Salt in Javascript aus meiner Sicht nicht so praktisch (kann ja von allen eingesehen werden) -> Kannst ja dann den Hash Serverseitig nochmals gesalzen hashen und in die DB ablegen.
 
Zurück
Oben