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

У меня есть две эти функции в 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'));

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

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

derpirscher 19.04.2019 07:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
1 931
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Эти функции 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));

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

Rutul Patel 19.04.2019 14:37

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

Rutul Patel 19.04.2019 14:38

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

Rutul Patel 19.04.2019 14:40

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

Terry Lennox 19.04.2019 14:45

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

Terry Lennox 19.04.2019 15:39

Здорово! Это немного сложнее, чем я думал, но в конце концов получилось!

Terry Lennox 19.04.2019 18:25

Они оба показывают разные результаты, потому что в вашем 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

Другие вопросы по теме