Ich bin auf der Suche nach einer einfachen, sicheren Lösung zum Speichern eines Benutzerpasswortes mit Node. Ich bin ein Kryptografie-Neuling, habe aber versucht, eine Lösung aus Online-Recherchen zusammenzustellen. Ich bin auf der Suche nach einer Bestätigung, dass das, was ich mir ausgedacht habe, eine solide Lösung für eine Web-App mit grundlegenden Sicherheitsanforderungen (keine Bank, Krankenhaus usw.) ist. Hier ist sie:Best Practices für die Kryptographie für die Passwortspeicherung in Node
var crypto = require('crypto');
var SALT_LENGTH = 64;
var KEY_LENGTH = 64;
var ITERATIONS = 1000;
function createHashedPassword(plainTextPassword, cb) {
crypto.randomBytes(SALT_LENGTH, function (err, salt) {
console.time('password-hash');
crypto.pbkdf2(plainTextPassword, salt, ITERATIONS, KEY_LENGTH, function (err, derivedKey) {
console.timeEnd('password-hash');
return cb(null, {derivedKey: derivedKey, salt: salt, iterations: ITERATIONS});
});
});
};
... und hier sind die Entscheidungen, die ich gemacht, die mich zu diesem Punkt gebracht:
Welche Hashing-Algorithmus zu benutzen?
Basierend auf this widely referenced article, sieht es aus wie die führenden Konkurrenten PBKDF2, bcrypt und scrypt. Ich habe PBKDF2 gewählt, weil es in Node integriert ist.
Welche Salzgröße verwenden?
10 schien die einfachste Antwort zu sein, die ich finden konnte. Ich weiß immer noch nicht genau, warum 64 Bytes die richtige Salzgröße sind. Wenn ich herum google, bekomme ich andere Stapelaustauschantworten wie this, aber ich bin nicht sicher, dass es auf den Node-Algorithmus zutrifft? Völlig verwirrt hier, eine Erklärung, die auf einen Anfänger zielt, der diese Knotenfunktion verwendet, würde fantastisch sein.
Welche Schlüssellänge zu verwenden?
Noch einmal, basierte ich weitgehend meine Wahl aus the same answer as above, aber ich bin genauso neblig auf die Grundlagen der "warum". Die Antwort besagt, dass es "eine Verschwendung ist, Schlüssel zu erzeugen, die kleiner sind als Ihre Eingabe, also verwenden Sie mindestens 64 Bytes". Hä? Auch hier wäre eine praktische Erklärung hilfreich.
Wie viele Iterationen verwenden?
Für diese Frage habe ich meine Auswahl aus this stack exchange answer basiert. Ich verstehe nicht viel davon, aber ich habe verstanden, dass der Algorithmus ungefähr 8ms dauern soll. Also, wie Sie sehen können, habe ich Timer auf die Funktion gesetzt, und ich habe meine Iterationen angepasst, um es in diesem Ballpark auf meiner Maschine zu bekommen.
Danke!
Wenn es um Sicherheit geht, ist es in der Regel besser auf die gut bekannt zu haften und gut getestete Bibliotheken. Passport.JS kommt Ihnen in den Sinn und es verfügt über Plugins, mit denen Sie Hashing durchführen können. –
Danke @ Pier-LucGendreau. Ich verwende PassportJS, aber es enthält nicht den Code zum Hashing und Speichern von Passwörtern als Teil seiner Bibliothek oder seiner Untermodule. Wenn mir etwas fehlt, lass es mich wissen. – markdb314
Sie können https://github.com/saintedlama/passport-local-mongoose verwenden –