2016-06-22 2 views
0

코드 Node.js를 파이썬 스크립트와 일치하지 않습니다Node.js를 crypto.pbkdf2Sync 암호는 내가 이것에 의해 생성 된 암호를 저장하는 MongoDB를 서버가

encryptPassword(password, callback) { 
    if (!password || !this.salt) { 
     return null; 
    } 

    var defaultIterations = 10000; 
    var defaultKeyLength = 64; 
    var salt = new Buffer(this.salt, 'base64'); 

    if (!callback) { 
     return crypto.pbkdf2Sync(password, salt, defaultIterations, defaultKeyLength) 
       .toString('base64'); 
    } 

    return crypto.pbkdf2(password, salt, defaultIterations, defaultKeyLength, (err, key) => { 
     if (err) { 
     callback(err); 
     } else { 
     callback(null, key.toString('base64')); 
     } 
    }); 
} 

그러나 인증 단계는 파이썬 스크립트에 의해 실행되는 일반 텍스트 암호를 사용하고 node.js.와 동일한 암호를 재구성해야합니다. django python 모듈에서 hashlib와 pbkdf2를 모두 사용하려고했지만 결과가 일치하지 않았습니다. hashlib 스크립트는 다음과 같습니다.

salt = base64.b64encode(b'salt') 
hashedPassword = hashlib.pbkdf2_hmac('sha1', b'password', salt, 10000, 64) 
encodedPassword = base64.b64encode(res) 

어떤 아이디어가 있습니까? 당신의 노드 코드에서

답변

0

,이 있습니다

var salt = new Buffer(this.salt, 'base64'); 

this.salt는 소금을 포함하는 Base64로 인코딩 문자열 있다고 가정합니다. 이어서 Buffer으로 디코딩됩니다. 따라서 salt은 (이진) 버퍼입니다.

salt = base64.b64encode(b'salt') 

이 바이너리 문자열 salt을 소요하고 Base64로 인코딩합니다 : 파이썬 코드에서

, 당신이 있습니다. 따라서 salt은 (Base64로 인코딩 된) 문자열입니다.

Node (바이너리 버퍼)와 Python (Base64로 인코딩 된 문자열) 사이의 형식이 일치하지 않는 것에 주목하십시오. 를 디코딩,

salt = base64.b64decode('c2FsdA==') 
+0

감사 robertklep을 :

salt = b'salt' 

또는 소금으로 Base64로 인코딩 된 문자열을 취할 수있는 파이썬 코드를 허용하고,이를 디코딩 :

대신, 파이썬 코드에서 이것을 사용 그것은 파이썬과 소금 작동합니다. 다시 한 번 감사드립니다. – hasmet