2015-08-17 4 views
1

Мой опыт работы с защитой паролем практически не существует. Я не принимал ни одного криптографического класса в колледже, и мои математические курсы вкратце коснулись фактических алгоритмов шифрования. Теперь, хотя я хотел бы хранить пароли пользователей в базе данных для создания безопасного метода для входа в мое приложение. После прочтения this, есть несколько вещей, которые я собрал:Пароль Hashing с JavascriptNodejs

  • хеширования паролей должна занять значительное количество времени, чтобы предотвратить повторные попытки входа в систему и повысить безопасность.
  • Два или более паролей может потенциально хэш в той же строке.

Имея это в виду, я попытался реализовать хеширование пароля на моем сервере узлов, используя jssha. Копирование примеров из ридх:

var jsSHA = require('jssha'); 
var sha = new jsSHA("SHA-512", "TEXT"); 
sha.update("password"); 
var hash = sha.getHash("HEX"); 

console.log(hash); 

Я могу создать хэш для строки пароля, но этот модуль, кажется, нарушает две из указанных выше пунктов маркированных. Запуск сценарий 5 раз подряд создает ту же строку каждый раз, и даже при использовании дополнительного HashMap в конструкторе для добавления итераций:

var sha = new jsSHA("SHA-512", "TEXT", '{"numRounds" : 4000000}'); 

хэша завершенных в микросекундах, независимо от количества раундов, которые Я поставляю конструктору.

Я не могу найти документацию для хеширования, особенно в Javascript/Node. Я неправильно использую модуль или должен использовать что-то еще?

+1

Третий параметр должен быть литералом объекта, а не строкой. – SLaks

+1

. Вы получите более подробные ответы на http://security.stackexchange.com/. Однако я настоятельно рекомендую использовать SHA-512, поскольку он в значительной степени нарушен как безопасный хеш. Современный уровень шифрования, хотя HMAC-SHA1 также считается приемлемым выбором. –

+0

О, действительно ... Я займусь этим скриншотом. –

ответ

0

Узел имеет встроенный модуль для ключа на основе хэш-растяжку: crypto.pbkdf2

Я использую следующие функции для создания хэшей:

function createHash(password, salt, iterations, hashLength, callback) { 
    if(hashLength % 2 !== 0){ 
     throw new Error("hashLength must be even, because it returns a string of two-character hexadecimal digits."); 
    } 
    var keyLength = hashLength/2; 
    iterations = iterations || 10000; 
    crypto.pbkdf2(password, salt, iterations, keyLength, function(err, bytes){ 
     var hash = Buffer(bytes, 'binary').toString('hex'); 
     callback(err, hash); 
    }); 
} 

... где password это буквальный текст для преобразования в ahh, salt - это случайная строка, которая должна храниться вместе с паролем, iterations - это количество раз, чтобы повторить алгоритм растягивания ключей, keyLength - это то, как долго заканчивается шестнадцатеричная хеш-строка, а callback возвращает хэш t o вызывающий код.

Я сохраняю итерации и длину ключа в одной строке базы данных с хешем и солью, а не в конфигурации, поэтому у меня есть возможность упростить шифрование, когда пользователь обновляет свой пароль.

Модуль крипто также включает в себя способ создания соли crypto.randomBytes, который я использую, как так:

function createSalt(saltLength, callback){ 
    if(saltLength % 2 !== 0){ 
     throw new Error("saltLength must be even, because it returns a string of two-character hexadecimal digits."); 
    } 
    var byteLength = saltLength/2; 
    crypto.randomBytes(byteLength, function(err, bytes){ 
     var salt = Buffer(bytes, 'binary').toString('hex'); 
     callback(err, salt); 
    }); 
} 

Отказ от ответственности: Я не криптограф либо. :)

+0

Почему вы выбрали PBKDF2 над Scrypt, Bcrypt и HMAC-SHA1, как и другие? –

+0

Потому что это реализация по умолчанию Node. То, что привлекло меня к этому, было не его силой, а тем фактом, что я полагаю, как встроенную библиотеку Node, что он будет хорошо поддержан и широко проверен. Это самый сильный доступный алгоритм? Вероятно, нет, но другие схемы, как представляется, имеют другие недостатки (например, использование большой памяти для более безопасного шифрования), и это кажется достаточно безопасным для моих целей. FWIW, он упоминается вместе с bcrypt в этой статье Crackstation, которую вы опубликовали как «стандартный алгоритм». – autodidact