Шаблон хеширования меняется каждый раз при перезапуске сервера - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть таблица, в которой есть два столбца: лицензия & активирована .

Я храню код лицензии не в виде обычного текста, а в хеше.Я использую модуль bcrypt для создания хэша с солью раунд 10. Проблема возникает, когда я ищу лицензию в базе данных.Для поиска лицензии я сначала генерирую хеш лицензии, а затем выполняю поиск в базе данных.Работает нормально, пока сервер не будет перезагружен.

Когда сервер перезагружается, он генерирует другую строку хеша для того же кода лицензии.Есть ли способ это исправить?Как я могу прекратить изменять шаблон хеширования для одного и того же кода лицензии при каждом перезапуске сервера?

1 Ответ

0 голосов
/ 03 декабря 2018

Проблема в соли и способе использования bcrypt.Вы используете saltRounds для генерации новой соли (случайное значение), поэтому хеш всегда будет другим.Если использовать фиксированное значение соли, хеш будет таким же.См. Пример ниже:

        const bcrypt = require('bcrypt');
        const saltRounds = 10;
        const myPlaintextPassword = 's0/\/\P4$$w0rD';
        const someOtherPlaintextPassword = 'not_bacon';

        bcrypt.genSalt(saltRounds, function(err, salt) {
            console.log('new salt:%s',salt);
            bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
                // Store hash in your password DB.
                console.log('new hash:%s',hash);
            });
        })
        //first time generated values were below, but each run will generate new values:
        //salt:$2b$10$X4kv7j5ZcG39WgogSl16au
        //hash:$2b$10$X4kv7j5ZcG39WgogSl16aupL0..j8Fmm8Lwgq92uWuM5KyXhE6tpO

        //Generate the same hash value as fixed salt value is used
        salt = '$2b$10$X4kv7j5ZcG39WgogSl16au'
        bcrypt.hash(myPlaintextPassword, salt, function(err, hash) {
            console.log('same value:%s', hash); //hash:$2b$10$X4kv7j5ZcG39WgogSl16aupL0..j8Fmm8Lwgq92uWuM5KyXhE6tpO
        });

        // Test comparison
        hash='$2b$10$X4kv7j5ZcG39WgogSl16aupL0..j8Fmm8Lwgq92uWuM5KyXhE6tpO' //first hash of myPlaintextPassword
        bcrypt.compare(myPlaintextPassword, hash, function(err, res) {
            console.log('Test using the correct password/key - should authenticate');
            if (res === true) {
                console.log('authenticated ');
            } else {
                console.log('NOT authenticated');
            }
        });
        bcrypt.compare(someOtherPlaintextPassword, hash, function(err, res) {
            console.log('Test using an incorrect password/key - should fail authentication');
            if (res === true) {
                console.log('authenticated');
            } else {
            console.log('NOT authenticated');
            }
        });

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

...