2014-01-11 5 views
9

저는 파이썬을 배우고 있습니다. hashlib.sha512(salt + password).hexdigest()이 예상 된 결과를 제공하지 않는 이유를 알 수 없습니다.파이썬에서 hashlib 대 crypt.crypt(). 다른 결과가 나타나는 이유는 무엇입니까?

Ulrich Drepper의 sha512crypt.c algorithm에 해당하는 순수한 Python 구현을 찾고 있습니다. (내가 무엇을 찾고 있는지 알기까지 잠시 시간이 필요했습니다.)

내 우분투 12.04 시스템의 crypt에 대한 man 페이지에 따르면, crypt는 SHA-512를 사용하고 있습니다 (문자열은 $ 6 $로 시작하기 때문에).

아래 코드는 Python의 시스템 크립트 (crypt.crypt()) 래퍼를 호출 할 때 예상대로 동작하는지 확인합니다. hashlib.sha512 또는 다른 파이썬 lib를 사용하여 crypt.crypt()와 같은 결과를 얻고 싶습니다. 방법?

이 코드는 문제 나 발생하고있어 보여줍니다 crypt 설명서 페이지에 따르면

import hashlib, crypt 

ctype = "6" #for sha512 (see man crypt) 
salt = "qwerty" 
insalt = '${}${}$'.format(ctype, salt) 
password = "AMOROSO8282" 

value1 = hashlib.sha512(salt + password).hexdigest() #what's wrong with this one? 
value2 = crypt.crypt(password, insalt) #this one is correct on Ubuntu 12.04 
if not value1 == value2: 
    print("{}\n{}\n\n".format(value1, value2)) 

을, SHA-512는 86 개 문자입니다. 위의 코드에서 crypt() 호출은 그에 부합합니다.

051f606027bd42c1aae0d71d049fdaedbcfd28bad056597b3f908d22f91cbe7b29fd0cdda4b26956397b044ed75d50c11d0c3331d3cb157eecd9481c4480e455 
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/ 
그러나, hashlib.sha512의 출력은 다음

코드를 실행하지 않는 사람들에 대한 출력의 ... 그래서 뭔가 해제 방법이 두 implmentations 사이에, 86 개 문자 이상입니다

여기에서 초기 피드백을 기반으로하는 또 다른 시도입니다. 아직 성공 다음 crypt() 출력이 base64로 인코딩하기 때문에

import hashlib, crypt, base64 

ctype = "6" #for sha512 (see man crypt) 
salt = "qwerty" 
insalt = '${}${}$'.format(ctype, salt) 
password = "AMOROSO8282" 

value1 = base64.b64encode(hashlib.sha512(salt + password).digest()) 
value2 = crypt.crypt(password, insalt) #this one is correct 
if not value1 == value2: 
    print("{}\n{}\n\n".format(value1, value2)) 
+0

비밀번호합니다 (제외인가 숫자) 포르투갈어로 의도적으로 또는 어색한 우연의 일치입니까? 그냥 호기심 많음':)' – JMCF125

+1

이 암호는 실제 도난당한 암호의 대용량 데이터베이스 중 하나 인 fwiw에서 가져온 실제 암호입니다. – MountainX

+0

나는 본다. 소금이 없다면, 작은 포르투갈어 사전으로 만든 무지개 테이블로 깨지기 쉽습니다. BTW, +1, 파이썬을 사용하지 않지만 흥미로운 질문입니다. – JMCF125

답변

11

여기 해결책이 있습니다. 이 다른 질문에 대한 자세한 내용도 있습니다. Python implementation of sha512_crypt.c passlib의 백엔드에는 순수 Python 구현 sha512_crypt가 포함되어 있으며 crypt.crypt()가 OS에서 사용할 수없는 경우 Python 구현이 호출됨을 보여줍니다.

$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/ 
$6$qwerty$wZZxE91RvJb4ETR0svmCb69rVCevicDV1Fw.Y9Qyg9idcZUioEoYmOzAv23wyEiNoyMLuBLGXPSQbd5ETanmq/ 

하나 중요한 점은 Passlib 시스템이 '아무튼 때 사용됩니다 sha512_crypt의 순수 파이썬 구현을 가지고 있다는 것입니다 : 출력

$ sudo를가 passlib 여기

import passlib.hash, crypt 

ctype = "6" #for sha512 (see man crypt) 
salt = "qwerty" 
insalt = '${}${}$'.format(ctype, salt) 
password = "AMOROSO8282" 

value1 = sha512_crypt.encrypt(password, salt=salt, rounds=5000) 
value2 = crypt.crypt(password, insalt) 
if not value1 == value2: 
    print("algorithms do not match") 
print("{}\n{}\n\n".format(value1, value2)) 

설치 PIP입니다 현재 리눅스 시스템이 가지고있는 암호 구현을 가지고있다 (예를 들어, http://www.akkadia.org/drepper/SHA-crypt.txt).

여기 PassLib에 대한 문서를 참조하십시오 : - 파이썬에 대한 암호 해시 라이브러리 -

passlib 구글 프로젝트 호스팅
https://code.google.com/p/passlib/

Passlib 1.6.2 문서 - Passlib의 v1.6.2 문서
http://pythonhosted.org/passlib/

passlib-users - Google 그룹
,

새 응용 프로그램 빠른 시작 가이드 - Passlib v1.6.2 문서
http://pythonhosted.org/passlib/new_app_quickstart.html#sha512-crypt

passlib.hash.sha512_crypt - SHA-512 크립트 - Passlib의 v1.6.2 문서
http://pythonhosted.org/passlib/lib/passlib.hash.sha512_crypt.html#passlib.hash.sha512_crypt

4

귀하의 암호가 같은 길이없는, 즉 없습니다 당신은 value1에 대한 hexdigest를 사용합니다. 대신 hexdigest의

, 당신은 bash implementation처럼 crypt_base64

value1 = crypt_base64(hashlib.sha512(salt + password)) 

처럼 뭔가를 시도해야한다, doHash() 기능의 마지막 부분.

+0

좋은 제안이지만 답변이 충분하지 않습니다. 간단한 예제를 기반으로 Python 코드를 제공 할 수 있습니까? Base64 인코딩으로 답변을 업데이트했지만 두 결과가 여전히 일치하지 않습니다. – MountainX

+1

@MountainX bash 스크립트가 "표준"b64 인코딩을 구현한다고 생각하는 것은 잘못입니다. base64에서 b64encode를 호출하여 crypt_base64를 지연 구현할 수 없습니다. –

+0

답변 해 주셔서 감사합니다. 그것은 올바른 길로 나를 도왔습니다. "실행할 준비가되었습니다"솔루션에 대한 내 대답을보십시오. – MountainX

7

crypt의 설명서는 부정확합니다 (오도 된 것입니다). "MD5", "SHA-256"또는 "SHA-512"모니 커와 함께 crypt에서 사용되는 알고리즘은 사실 알고리즘에 기본으로 설정된 알고리즘입니다. 그들은 password-based key derivation functions이고, 해시를 사용하여 key strengthening을 수행합니다.

good password hashing algorithm에는 두 가지 속성이 있습니다. 암호를 고유 한 소금 (한 번에 여러 암호를 해독하려는 시도를 무효로하기 위해)을 결합해야하며 속도가 느려야합니다 (공격자가 수호자보다 더 많이 아프기 때문에 공격자 많은 조합을 시도해야 함). MD5 및 SHA 제품군과 같은 일상적인 해시 알고리즘은 원하는 보안 속성을 유지하면서 가능한 한 빨리 빠르도록 설계되었습니다. 암호 해시 알고리즘을 작성하는 한 가지 방법은 암호 해시 알고리즘을 사용하여 여러 번 반복하는 것입니다. 이 isn't ideal (암호 크래킹을위한 전용 하드웨어를 만드는 것이 더 나은 기술이 있기 때문에)이 적합합니다.

Wikipedia article for crypt(3)은 간단한 설명과 1 차 출처에 대한 안내를 제공합니다.Linux와 FreeBSD의 매뉴얼 페이지는 좋지 않지만, Solaris's은 오도 된 정보가 충분합니다 (crypt.conf(4), 그 다음 crypt_sha512 및 그 외 링크). Is user password in ubuntu 13.04 in plain text?Is there repetition in the Solaris 11 hash routine? Can I add some?

crypt의 출력을 파이썬에서 계산하는 올바른 방법은 crypt.crypt입니다.

+0

답변 해 주셔서 감사합니다. 그것은 올바른 길로 나를 도왔습니다. – MountainX

관련 문제