Шифрование пароля sha1 php для узла js crypto

#php #node.js #sha1 #cryptojs

#php #node.js #sha1 #cryptojs

Вопрос:

У меня есть эти две функции в php.

 public function hashSSHA($password) {
    $salt = sha1(rand());
    $salt = substr($salt, 0, 10);
    $encrypted_password = base64_encode(sha1($password . $salt, true).$salt);
    $hash = array("salt"=>$salt, "encrypted"=>$encrypted_password);
    return $hash;
}

//Password Decryption 
public function checkhashSSHA($salt, $password) {
    $hash = base64_encode(sha1($password . $salt, true).$salt);
    return $hash;
}
 

Я пытаюсь написать эти две функции в узле js.

Вот что я попробовал.

 const hash = crypto.createHash('sha1', 'my different salt from DB');
hash.update(password);
console.log(hash.digest('base64'));
 

Но оба они дали разные результаты.

Комментарии:

1. Вы делаете разные вещи. Прежде всего, обязательно используйте одинаковые salt и password . Затем в вашем php-коде вы используете salt дважды при вычислении вашего результата. Это, конечно, приводит к разным результатам

Ответ №1:

Эти Node.js функции должны быть эквивалентны вашему PHP-коду:

 const crypto = require("crypto");

function hashSSHA(password){
    let salt = crypto.createHash('sha1').update(crypto.randomBytes(8)).digest('base64');
    salt = salt.substring(0,10);
    const hash = crypto.createHash('sha1');
    hash.update(password   salt);
    return {
        salt: salt,
        encrypted: Buffer.concat([hash.digest(), Buffer.from(salt)]).toString('base64')
    };
};

function checkhashSSHA(salt, password) {
    const hash = crypto.createHash('sha1');
    hash.update(password   salt);
    return Buffer.concat([hash.digest(), Buffer.from(salt)]).toString('base64');
}

const password = "some password";
const hashResult = hashSSHA(password);
console.log("Hash result: ", hashResult);
console.log("Check hash result: ", checkhashSSHA(hashResult.salt, password));
 

Комментарии:

1. Это очень близко.

2. Проверьте результат хэша: VT3R9IR7dZDX MHMPZWKfg / aGN8=993f075527 VT3R9IR7dZDX MHMPZWKfg /aGN85OTNmMDc1NTI3 Первый из вашего узла, а второй из PHP

3. основное отличие, я думаю, в соли, $encrypted_password = base64_encode(sha1($ password . $ salt, true). $ salt); эта строка содержит соль в base64, но в node ее нет, есть идеи @terry Спасибо за вашу помощь.

4. @RutulPatel круто, дай мне просто проверить код, и я обновлю.

5. Я внес обновление в код, вы можете попробовать, спасибо!

Ответ №2:

Они оба показывают разные результаты, потому что в ваш PHP-код добавлена соль, а в NodeJS — другая соль. Вот почему оба имеют разные хэши, но если вы сравните их с помощью встроенных функций, результат должен возвращать true.

 npm install bcrypt
 

 var bcrypt = require('bcrypt');
var hash = bcrypt.hashSync("my password");

bcrypt.compareSync("my password", hash); // true
bcrypt.compareSync("not my password", hash); // false