У меня есть две эти функции в 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.info(hash.digest('base64'));
Но оба они дали разные результаты.






Эти функции 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.info("Hash result: ", hashResult);
console.info("Check hash result: ", checkhashSSHA(hashResult.salt, password));
Это очень близко.
Проверьте результат хэша: VT3R9IR7dZDX+MHMPZWKfg/aGN8=993f075527 VT3R9IR7dZDX+MHMPZWKfg/aGN85OTNmMDc1NTI3 Первый из вашего узла, а второй из PHP
я думаю, основное отличие заключается в соли, $encrypted_password = base64_encode(sha1($password . $salt, true).$salt); эта строка покрывает соль в base64, но в узле этого нет, есть идеи @terry Спасибо за вашу помощь.
@RutulPatel круто, позвольте мне просто проверить код, и я обновлю его.
Я сделал обновление кода, вы можете попробовать, спасибо!
Здорово! Это немного сложнее, чем я думал, но в конце концов получилось!
Они оба показывают разные результаты, потому что в вашем PHP-коде вы добавили соль, а в NodeJ — другую соль. Вот почему оба имеют разные хэши, но если вы сравните их с помощью встроенных функций, результат должен вернуть 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
Вы делаете разные вещи. Прежде всего, обязательно используйте одни и те же
saltиpassword. Затем в вашем php-коде вы дважды используетеsaltпри вычислении результата. Это, конечно, приводит к другим результатам