2017-04-04 2 views
1

여러 가지 이유로 NodeJS에 파이썬 모듈을 이식하려고 시도 중이고 약간의 장애물이 있습니다. 적절한 MD5 다이제스트를 얻는 데 어려움을 겪고 있습니다. (예, MD5의 보안 문제를 알고 있지만 연결하려는 앱의 텍스트 또는 일반 텍스트 중 하나입니다.) 내가 올 수 있었던 가장 가까운이 코드 내 자바 스크립트 코드를 지금NodeJS에서 Python DIGEST-MD5 해싱 함수를 복제하는 데 문제가 있습니다.

digest: ȣ�P��r�l������ 
digest char codes: [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198] 
fullsecret: ȣ�P��r�l������:241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7 
fullsecret char codes: 
    [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55] 
hexdigest: 6f9d2b47bd232495c2f765ce5a5d8ba7 

다음을 출력

from hashlib import md5 

username = 'username' 
password = 'password' 
nonce = '241d4105fe8f60cef84524f6' 
cnonce = '7db4c8275fb38f94774c1fe7' 

secret = '%s:my realm:%s' % (username, password) 
digest = md5(secret).digest() 
fullsecret = ':'.join([digest, nonce, cnonce]) 
hexdigest = md5(fullsecret).hexdigest() 

print 'digest: %s' % digest 
print 'digest char codes: ' + str([ord(c) for c in digest]) 
print 'fullsecret: %s' % fullsecret 
print 'fullsecret char codes:\n ' + str([ord(c) for c in fullsecret]) 
print 'hexdigest: %s' % hexdigest 

:

여기 파이썬 버전을 작업 단순화 입니다 :

var crypto = require('crypto'); 

var username = 'username'; 
var password = 'password'; 
var nonce = '241d4105fe8f60cef84524f6'; 
var cnonce = '7db4c8275fb38f94774c1fe7'; 

var secret = username + ':my realm:' + password; 
var digest = crypto.createHash('md5').update(secret).digest('binary'); 
var fullsecret = [digest, nonce, cnonce].join(':'); 
var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex'); 

console.log('digest: ' + digest); 
// console.log('digest char codes: [' + digest.map((x) => { return x; }).join(', ') + ']'); 
console.log('fullsecret: ' + fullsecret); 
console.log('fullsecret char codes:\n [' + fullsecret.split('').map((x) => { return x.charCodeAt() }).join(', ') + ']'); 
console.log('hexdigest: ' + hexdigest); 

그리고 그 코드는 때문에 : 나는 문제가 버퍼 (변수 다이제스트)에서 문자열 변환을 것으로 생각하고 있지만 나는이 문제를 해결하는 방법을 찾을 수없는 한

digest: ȣ�P��r�l������ 
fullsecret: È£øP¶r¼l¸¨Æ:241d4105fe8f60cef84524f6:7db4c8275fb38f94774c1fe7 
fullsecret char codes: 
    [200, 163, 248, 16, 80, 182, 139, 114, 188, 108, 184, 141, 136, 168, 130, 198, 58, 50, 52, 49, 100, 52, 49, 48, 53, 102, 101, 56, 102, 54, 48, 99, 101, 102, 56, 52, 53, 50, 52, 102, 54, 58, 55, 100, 98, 52, 99, 56, 50, 55, 53, 102, 98, 51, 56, 102, 57, 52, 55, 55, 52, 99, 49, 102, 101, 55] 
hexdigest: 5deef0b84014693b745ea40b047f4ae8 

. 나는 심지어 here (시작 라인 178)에서 관련 코드를 가져다 봤지만 그게 또 다른 hexdigest (그리고 내가 뭘 읽었는지, "바이너리"인코딩은 사용되지 않습니다) 다음 코드를 사용하여 :

function md5(str, encoding){ 
    return crypto 
     .createHash('md5') 
     .update(str) 
     .digest(encoding || 'hex'); 
} 

var hexdigest = md5(md5(secret, 'binary') + ':' + nonce + ':' + cnonce); 
console.log('hexdigest: ' + hexdigest); 

이 출력합니다 :

hexdigest: 5deef0b84014693b745ea40b047f4ae8 

첫 번째 질문 : 사람이 이런 일이되고 이유를 알고/또는 어떻게 작동 얻을 알고 있나요?

두 번째 질문 : NodeJS에 파이썬 코드를 이식하는 더 좋은 방법이 있습니까?

현재 NodeJS 7.6.0을 사용하고 있습니다. 이것에 대해 밝히는 데 도움을 줄 수있는 누군가에게 감사 드리며, 키보드에서 오랫동안 머리를 때리는 데 시간을 보냈습니다.

UPDATE : 2017년 4월 5일

이 자고 후에는 ... 내가 다이제스트가 올바른지 얻을 수있는 .digest ('진')를 사용할 필요가 않는 것이 밝혀졌습니다. 완전 암호 문자 코드를 비교할 때 .digest ('binary')를 사용하지 않으면 Python과 JS간에 차이가 있습니다. 그러나 fullsecret 문자열에 과 동일한 문자 코드가 포함되어 JS에서 마지막 hexdigest 부분에 문제가 발생했습니다. 위의 코드와 출력이 변경 사항을 반영하도록 수정되었습니다.

답변

1

바이트를 문자열로 표시하지 않는 것이 가장 좋습니다.

var crypto = require('crypto'); 

var username = 'username'; 
var password = 'password'; 
var nonce = Buffer.from('241d4105fe8f60cef84524f6'); 
var cnonce = Buffer.from('7db4c8275fb38f94774c1fe7'); 

var secret = username + ':my realm:' + password; 
var digest = crypto.createHash('md5').update(secret).digest(); 
var fullsecret = Buffer.concat([digest, Buffer.from(':'), nonce, Buffer.from(':'), cnonce]); 
var hexdigest = crypto.createHash('md5').update(fullsecret).digest('hex'); 

console.log('digest: ' + digest); 
console.log('digest char codes: [' + digest.join(', ') + ']'); 
console.log('fullsecret: ' + fullsecret); 
console.log('fullsecret char codes:\n [' + fullsecret.join(', ') + ']'); 
console.log('hexdigest: ' + hexdigest); 

참고 Buffer.from()들 버퍼를 연결하는 바이트로서 Buffer.concat을 ASCII 문자열을 인코딩 대신 문자열의 버퍼를 생성하기의 부호화 인수 .digest()하기 : 노드는에 대한 Buffer 형태를 갖는다.

+0

감사합니다. 한순간에 나는 nonce와 cnonce를 버퍼로 두었지만 각 콜론의 버퍼를 만드는 것을 놓쳤습니다 ... 이것은 매력처럼 작동합니다. –

관련 문제