2011-12-28 1 views
0

PostgreSQL은 암호 저장을위한 MD5 만 암호화합니다.은 md5 암호화 만 가지고 있으며 비밀번호를 저장하는 가장 좋은 방법은 무엇입니까?

해킹 로그를 읽는 것부터 보면 MD5만으로는 비밀번호를 저장하는 데 매우 안전한 방법이 아닌 것으로 보입니다.

저는 MD5의 MD5를 클라이언트에서 한 번, MD5를 —에서 다시 사용했습니다. 그러나 이것이 훨씬 더 강력하다는 것을 모릅니다.

먼저 암호를 저장하는 것이 필요합니까? 둘째, 간단하고 효과적인 크로스 언어 방식은 무엇인가?

+0

유권자를 닫아주십시오. 개성을 설명해 주시겠습니까? –

+0

저장 프로 시저를 광범위하게 사용하기 때문에 전통적으로 응용 프로그램 수준으로 이식하기 전에 db 수준에서 모든 것을 테스트했습니다. 어쩌면 당신 말이 맞을 것입니다 - 아마도 내 접근 방식이 나를 눈이 멀게 만들었을 것입니다. –

+0

물론'pgcrypto'도 사용할 수 있습니다 : http://www.postgresql.org/docs/8.3/static/pgcrypto.html ...하지만 나인 경우 응용 프로그램 수준에서 수행합니다 :) –

답변

8

pgcrypto 확장 당신에게 기능과 사용하는 도구 모음을 제공합니다 설치. 암호를 저장하는 좋은 방법 인 bcrypt을 사용할 수 있습니다.

postgres에서 사용하지 않는 경우 사용하는 언어로 외부에서 사용하는 것으로 간주 할 수 있습니다.

관련 링크 : 포스트 그레스 부품에 대해서는 http://www.postgresql.org/docs/current/static/pgcrypto.html, 사용 이유에 대해서는 http://codahale.com/how-to-safely-store-a-password/에 대한 설명을 참조하십시오.

+0

위대한 링크! 감사! –

+1

아, 네. 분명히 이른 시간이 내 기억을 도왔습니다. bcrypt는 암호 해싱에 사용될 때 sha256보다 확실히 좋습니다 (그리고 scrypt는 더 좋을 것입니다 ...) –

2

데이터베이스에서 해시를 수행 할 필요가 없습니다. 두에 사용자 이름과 암호를 확인할 수 있습니다

password_hash = sha256(user_name + password) 
user_id = query("SELECT id FROM user WHERE name=? and password_hash=?", 
       user_name, password_hash).first() 

또는 : 응용 프로그램 수준에서가에 당신이 해시 된 암호에 액세스하지 않고 판단 할 수있는 사용자 이름과 같은에 소금을 기반으로 제공, 그냥 안전한이다 별도의 단계는 소금으로 사용자 ID를 사용하여 :

user_id, password_hash = query("SELECT id, password_hash FROM user WHERE name=?", 
           user_name).first() 
if password_hash != sha256(user_id + password): 
    raise Exception("authentication failed") 
+0

user_name은 휘발성이 있습니다. usr_id 작업에서도 염분이 있습니까? –

+0

물론, 그것도 작동합니다 :'user_id, password_hash = query ("SELECT id, password_hash FROM user WHERE name =?", user_name); if password_hash! = sha256 (user_id + password) : raise 예외 ("인증 실패")' –

관련 문제