2009-09-04 7 views
14

MD5 해시를 사용하여 데이터베이스에 사용자 비밀번호가 저장되어있는 이전 애플리케이션이 있습니다. 나는 이것을 SHA-2 패밀리의 어떤 것으로 바꾸고 싶다.MD5에서 SHA로 암호 해싱을 어떻게 변환합니까?

나는 이것을 수행하는 두 가지 방법을 생각해 냈지만 두 가지 모두 다소 어수선해 보입니다.

1) 부울 "플래그"필드를 추가하십시오. 이 후에 사용자가 처음으로 인증 할 때 MD5 암호 해시를 SHA 암호 해시로 바꾸고 플래그를 설정하십시오. 그런 다음 플래그를 검사하여 암호 해시가 변환되었는지 확인할 수 있습니다.

2) SHA 해시를 저장할 두 번째 암호 필드를 추가하십시오. 이 후에 사용자가 처음으로 인증하면 SHA로 암호를 해시하고 새 필드에 저장합니다 (동시에 MD5 해시를 삭제할 수 있음). 그런 다음 SHA 필드에 값이 있는지 확인할 수 있습니다. 이것은 본질적으로 내 깃발이됩니다.

어느 경우 든 로그인 빈도가 낮은 사용자는 잠시 동안 MD5 인증을 유지해야합니다. 더 이상 활성화되지 않은 사용자는 절대로 SHA로 전환되지 않습니다.

더 좋은 방법이 있나요?

+3

당신이 솔루션은 나에게 좋아 보인다. – wtaniguchi

+0

그리고 네드의 답변을 올리 겠어. 그는 좋은 지적이있다. – wtaniguchi

+5

전환 한 적이없는 사용자는 특정 비율의 사람들이 전환되어 MD5 해시를 제거하기에 충분한 시간이 지난 후에 고려할 것입니다. 이 기간 동안 로그온하지 않은 사용자는 다시 로그인 할 때 비밀번호를 재설정해야합니다. 그것이 수용 가능한지 여부는 비즈니스 결정입니다. –

답변

11

본질적으로 동일하지만 추가 필드 추가하는 것보다 어쩌면 더 우아한 : Django에서 기본 인증 framwork에서이 암호 해시는 다음과 같이 구성 문자열로 저장됩니다

hashtype$salt$hash 

Hashtype은 SHA1 또는 MD5 중 하나입니다, salt는 원시 암호를 암호화하는 데 사용되는 임의 문자열이며 마지막에는 해시 자체가옵니다.예 값 :

sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4 
+0

이것은 가장 좋은 답변입니다. –

+0

유일한 문제는 소금을 저장하는 방식으로 소금을 저장한다는 점입니다 (예 : 계정 생성시 타임 스탬프의 변이 된 버전 또는 비트 - 사용자 이름 등등.) 이것이 균열에 걸리는 시간이 현재 실현 가능한 차이를 만들어 내는지 여부는 논란의 여지가 있습니다. 나는 단지 편집증에 지나지 않습니다. – defines

+0

@Dustin : 소금은 사용자가 암호를 변경할 때마다 변경 될 수 있습니다. – Joshua

3

나는 당신이 이미 최고의 가능성을 가지고 있다고 생각합니다. 나는 sha가 설정되면 md5를 사용하지 않으므로 # 1보다 # 2 이상 좋아한다.

MD5를 되돌릴 방법이 없으므로 사용자가 새 인증을 만들기 위해 다시 인증 할 때까지 기다려야합니다.

0

두 번째 제안이 나에게 가장 잘 들립니다. 그렇게하면 빈번한 사용자는 앞으로 더 안전한 경험을하게 될 것입니다.

첫 번째 효과적으로 "quirks-mode"는 코드베이스이며 새로운 사용자가 더 나은 SHA 경험을 갖도록합니다.

+0

저에게는 두 가지 해결책이 동일하고, 약간 다르게 구현 된 것 같습니다. 어느 쪽이든 다음 번 로그인 할 때 비밀번호가 다시 나타납니다. –

+0

두 옵션 중 어느 것이 든 나는 다음에 로그인 할 때 기존 사용자의 비밀번호를 바꿀 것입니다. 그 다음에 사용할 해시를 앱에 알려주는 방법에 관한 질문 일뿐입니다. –

2

아니요 - 기본적으로 관심있는 모든 사용자가 변환 될 때까지 MD5를 그대로 유지해야합니다. 이것은 해싱의 본질 일뿐입니다. 변환을 다시 수행하기에 충분한 정보가 없습니다.

다른 옵션과 함께 유지하는 또 다른 옵션은 비밀번호 입력란을 효과적으로 설명하는 것입니다 (예 :

MD5:(md5 hash) 
SHA:(sha hash) 

그러면 비교할 알고리즘을 쉽게 감지 할 수 있으며 두 개의 필드가있는 것을 피할 수 있습니다. 다시 말하지만, MD5를 SHA로 덮어 쓰면됩니다.

모든 초기 암호를 MD5로 선언하려면 초기 업데이트를 수행하고 싶을 것입니다.

+4

해시의 크기에 따라 자체 설명됩니다. MD5는 항상 작습니다. –

+2

길이를 유일한 표시기로 사용하지 마십시오. 해시에 포함 된 내용 (예 : 넌스 계산, 다른 시드 데이터)을 변경하고 동일한 해시 알고리즘을 사용하여 모든 내용을 잘라내고 싶을 수 있습니다. 별도의 식별자가 있으면 * 자신의 * 비밀번호 해시 스키마가 사용 중임을 나타냅니다. – Rob

+1

두 가지 방법의 길이가 다른 경우 길이를 지표로 사용할 수 있습니다. –

-1

MD5가 염색되지 않은 경우 암호 해독 사이트/무지개 표를 항상 사용할 수 있습니다 (예 : http://passcracking.com/index.php). 아마도 다시 인코딩 방법을 사용하는 것이 더 쉽습니다.

+5

가능한 경우 암호를 저장하는 동안 많은주의를 기울이지 않으면 매우 윤리적이지 않습니다. –

+3

@Vinko - 비밀 번호가 저장/유출되지 않도록주의를 기울여도 비 윤리적 인 것으로 느껴집니다. –

6

당신은 당신이 먼저를 MD5ing하여 미래 암호를 만드는 경우 DB에서 그들을 다시 해싱하여 SHA1에 모든 MD5 문자열을 변환 할 수 있습니다. 비밀 번호를 확인 MD5ing 그들도 먼저 필요하지만 그게 큰 히트 생각하지 않습니다.

PHP 코드 (로그인) :

이전 : $ 로그인 = (MD5 ($ 암호) == $ storedMd5PasswordHash);

이후 : $ login = (sha1 (md5 ($ password)) == $ storedSha1PasswordHash);

염분도 사용하면 here에서 초기 아이디어를 얻을 수 있습니다.

-4

예는

당신의 MD5 암호화 된 문자열에서 실제 암호를 찾으려면

, 당신은 시도 할 수 있습니다 .. 당신은 SHA-1으로 변환하기 전에 먼저 실제 암호를 알고 있어야 md5pass.com

+3

이것은 잘 설계된 시스템에서는 불가능합니다. 모든 암호는 소금에 절인 저장해야합니다. –