2014-04-11 2 views
10

PHP 코드는 데이터베이스에 저장하는 password_hash을 사용하여 해시를 생성합니다. 다음은 PHP 코드입니다 :PHP에서 생성 된 nodejs의 비밀번호 해시 확인

$hash = password_hash($value, PASSWORD_BCRYPT, array('cost' => $cost)); 

나는 nodejs에서이 해시에 대해 암호를 확인하고 싶습니다.

나는 많은 노드 모듈 (bcrypt, phpass, node-bcrypt)을 보았지만, 모두 나에게 거짓을 주었다. 다음은 PHP에서 생성 된 샘플 해시이며 nodej에서 확인하려고하는 샘플 해시입니다.

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 

var bcrypt = require('bcrypt'); 

bcrypt.compare("secret", hash, function(err, res) { 
    console.log(res); 
}); 

나의 현재 해결 방법 (해결 방법을 필요로 사람을 위해) 검증하기 위해 노드를 통해 PHP 스크립트를 호출하는 것입니다

(여기에 비밀이 실제 암호)

var exec = require('child_process').exec; 
var cmd = 'php verify.php password encryped_pasword'; 
exec(cmd, function (error, stdout, stderr) { 
    // output is in stdout 
    console.log(stdout); 
//If stdout has 1 it satisfies else false 
}); 

이 해킹입니다 이 문제에 대한 좋은 대답은 아닙니다. 이와 같은 해결 방법을 사용하지 않고 nodejs에서 비밀번호를 확인하는 방법이 있습니까?

+0

당신은 내가 o0rebelious0o https://www.npmjs.org/package/bcrypt-nodejs – o0rebelious0o

+0

@을 살펴본 적이 그것을 사용하여 비교하려고했는데, false도 아니고 에러도없는 null을 준다. – Sudesh

+0

$ 비용은 getRounds()와 일치해야한다. 이것은 h이다. ow bcrypt가 작동합니다. – erenon

답변

18

해시 된 비밀번호의 $ 2y $를 $ 2a $로 바꾸면 bcrypt.compare가 올바른 결과를 제공해야합니다. ES6에

var hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 
var bcrypt = require('bcrypt'); 
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1'); 
bcrypt.compare("secret", hash, function(err, res) { 
    console.log(res); 
}); 

:

import bcrypt from 'bcrypt'; 
let hash = '$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2'; 
hash = hash.replace(/^\$2y(.+)$/i, '$2a$1'); 
bcrypt.compare('secret', hash, function(err, res) { 
    console.log(res); 
}); 
+2

덕분에 많은 도움이되었습니다. 아무도 모른다면 이것이 왜 필요한지 아는 것이 흥미로울까요? – iamjonesy

+0

그것이 효과가있다! 누군가 이것이 왜 이렇게 설명 할 수 있습니까? –

+1

이것에 대한 업데이트를 얻으려면 (1 년이 넘은 이후라면) – Sushruth

9

나는이 대답했습니다 알아,하지만 조금 더 자세히이 필요하다는 의견에서 보인다. 다음과 같이 PHP는 password_hash() 함수에 의해 생성 된

Bcrypt 해시 분할 :

$2y$08$9TTThrthZhTOcoHELRjuN.3mJd2iKYIeNlV/CYJUWWRnDfRRw6fD2

|  |  |      | 
|  |  Salt     Hashed Password 
|  | 
|  Algorithm options (cost, in this case) 
| 
Algorithm type 

그것은 여기에 다른 답변에서 보인다 그래서의 PHP 및 노드 버전 동안 Bcrypt는 다른 알고리즘을 사용합니다. 해시 출력의 유일한 차이점은 접두어입니다. 따라서 @Sudesh에 언급 된대로 을 $2a$, Bob의 삼촌을 바꿔야합니다.

소스

http://php.net/manual/en/faq.passwords.php

$2y bcrypt hashes in Node.js

Comparing BCrypt hash between PHP and NodeJS