2013-07-09 3 views
7

나는 django의 데이터베이스를 가지고 있으며 Node.js에서 작업하고 싶습니다. 나는 사용자 인증을해야한다. 데이터베이스 : 알고리즘 pbkdf2_sha256, salt, 10000 반복 및 base64 인코딩 해시로 알려져 있습니다. 주어진 base64-hash에 대한 암호를 인코딩하기 위해 JS에서해야 할 단계는 무엇입니까?Django pbkdf2_sha256 JS 구현

UPD : 여기에 해결책을 발견 : python (django) hashlib vs Nodejs crypto하지만 일치하지 해시와 JS 생성 된 해시를 장고 생성 ...
장고 다음 생성 :

pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo= 

JS :

pbkdf2_sha256$10000$NmzpPCQiTe2R$w4jCgWjDilrDmcOBd8K+I8OdwpkKwoVQZMKWH3FvYcKoAMKcwqlewobDocOEGMKZfQ== 

비밀 번호 : Simple123

+0

PBKDF에서 같은 바이트 수를 얻으려고 했습니까? 그 번호를 지정하지 않으면 반환 값으로 49 바이트를 얻는 것이 약간 이상합니다. 또한 두 함수 모두에서 암호의 동일한 문자 인코딩을 사용해야합니다. PBKDF2의 문자 인코딩은 지정되지 않습니다 (UTF-8이 암시되지만). –

답변

7

pbkdf2-sha256 (자신의 링크에서)을 사용하면 장고에서 가지고있는 해시와 동일한 해시를 생성 할 수 있습니다.

var pbkdf2 = require('pbkdf2-sha256'); 
var validatePassword = function (key, string) { 
    var parts = string.split('$'); 
    var iterations = parts[1]; 
    var salt = parts[2]; 
    return pbkdf2(key, new Buffer(salt), iterations, 32).toString('base64') === parts[3]; 
}; 
var djangoPass = 'pbkdf2_sha256$10000$NmzpPCQiTe2R$U8ipSsOy3Xz7FwWDHdH/dTei8Xh4Q7NGtdzrCacSfvo='; 
console.log(validatePassword('Simple123', djangoPass)); // Logs: true 

위 코드는 노드를 사용하여 장고에 저장된 암호의 유효성을 검사하기에 충분해야합니다.

0

내가 장고 passwor에 대해 사용자를 인증해야하는 비슷한 작업에 직면하게되었습니다. 자바에서 ds. Django에서 기본 pbkdf2_sha256 hasher를 사용하여이 목표를 달성하는 데 실패한 후 Java에서 동일한 알고리즘을 쉽게 복제 할 수 있도록 장고 암호를 해시하는 데 사용 된 방법을 변경했습니다. 이러한 방법으로

'django.contrib.auth.hashers.SHA1PasswordHasher'

장고에 저장된 암호 해시를 :

Django documentation에 설명 된대로 PASSWORD_HASHERS가 settings.py에 정의 된 순서를 수정할 수 있습니다, 나는 첫 번째 위치에이 심부름 군을 넣어 데이터베이스는 다음과 같이이다 :

sha1$upSZarr0w7CZ$304b22b1a9e7e5387e79f50e691043d3faf83c48

당신은 이미 그들이 자동으로 장고 a로 변환됩니다 데이터베이스에 약간의 암호가있는 경우 첫 번째 사용자 로그인.

구분 기호로 $를 사용하여 해시를 쉽게 토큰화할 수 있습니다. 첫 번째 토큰은 항상 sha1 (알고리즘 사용)이고 두 번째 토큰은 이고 마지막 토큰은 실제 해시입니다.

당신이

304b22b1a9e7e5387e79f50e691043d3faf83c48

가 예상 암호로 연접 소금의 SHA1 합 있는지 확인 할 수있는 암호를 일치 시키려면 : 우리의 경우 보안에

SHA1(upSZarr0w7CZ + password) = 304b22b1a9e7e5387e79f50e691043d3faf83c48

을 암호 해싱에 약한 알고리즘을 사용하는 것의 의미는 받아 들일 만하다.

+0

Django의 pbkdf2_sha256을 수행하는 Java 방법은 https://gist.github.com/JustinTArthur/3528cfca7e644547d6ce입니다. –

2

최근에 좀 더 쉽게 만들 프로젝트를 만들었습니다. 내 프로젝트는 노드에서 사용할 수 있으며 node-django-hashers이라고합니다.코드는 다음과 같습니다 :

https://github.com/kalvish21/hashers

샘플 사용 :

var hashers = require('node-django-hashers'); 

var h = new hashers.PBKDF2PasswordHasher(); 
var hash1 = h.encode("password", h.salt()); 
console.log(h.verify("password", hash1)); // returns true 
console.log(h.verify("wrong_password", hash1)); // returns false 

이 장고 암호 해시와 호환됩니다.