2011-04-27 7 views
2

ASP.NET 멤버십을 사용하는 웹 사이트를 개발했습니다. 이전 사이트의 의견을 토대로 암호를 잊어 버린 사용자를 위해 암호를 복구 할 수 있도록 암호를 암호화하기로 결정했습니다.암호화 된 암호를 해시 된 암호로 변환

그러나 새 사이트 (현재 등록 된 사용자가 500 명이 넘음)는 산업 표준이 암호를 해시하는 것이 맞다고 비판했습니다.

그러나 상당히 광범위한 검색을 수행 한 후 기존 사용자의 암호를 암호화에서 해시로 변환하는 방법을 찾을 수 없었습니다.

나는 web.config 파일을 변경할 수 있음을 알고 있으며, 새로운 사용자의 암호는 새로운 형식을 사용할 것입니다. 그러나 기존 사용자를 업데이트하는 것은 없습니다.

참고 : 이전에 유사한 질문을했지만 대부분 더 나은, 암호화 된 또는 해시 된 것에 대한 토론이있었습니다. 나는 그 토론을 지났지 만 이미 등록 된 수백 명의 사용자를 잃지 않고 그들을 변환 할 방법을 찾을 수 없었습니다.

답변

1

이전 질문 (Changing passwordFormat from Encrypted to Hashed)에 대한 Greg의 응답 (및 관련 의견)은 이동 방법입니다. 기본적으로, 당신이 원하는 :

  1. 이 암호를 해독 각각의 경우, 암호화 된 패스워드의 모든 사용자를에게
  2. 을 해시 멤버 자격 공급자
  3. 루프를 추가 해시를 생성하여 보관을 삭제 암호화 된 버전을 데이터베이스에서 가져와 계속 진행하십시오.

완료되면 암호화 된 모든 암호 사용자를 해시로 변환해야합니다.

+0

그렉에 대한 최종 의견을 보았습니까? 나는 기본적으로 그의 제안을 밟았지만, 결국 분명히 뭔가를 놓쳤다. 불행히도, 그는 그 의견에 응답하지 않았고 거기에서 끝났습니다. ASP.NET 멤버쉽에 대해 알지 못해도 충분하지 않을 것으로 생각됩니다. –

+0

"저장"이라고하면 그게 무슨 뜻입니까? 회원 공급자를 통해 또는 직접? 기존 데이터를 잃지 않고이를 수행하는 방법이 명확하지 않습니다. 어떻게 여러 공급자를 선택하고 무엇을하는지를 지정합니까? –

+0

아이디어는 * 기존 데이터 (암호화 된 암호)를 잃어 버리고 싶다는 것입니다. 이전 게시물의 주석에 따라 MembershipUser.GetPassword()를 사용하여 암호화 된 공급자의 현재 암호를 가져 오려고 할 수 있습니다. 이것은 해독 가능한 암호화를 사용하고 있기 때문에 가능합니다.이 메서드는 해시 된 공급자에서 작동하지 않습니다. 해독 된 암호가 있으면 해시 (소금으로)하고 싶습니다. 이는 일방 통행 프로세스입니다. 그런 다음 해쉬 된 멤버 자격 공급자를 사용하여 해시로 암호화 된 암호를 효과적으로 덮어 쓰게하여 암호의 결과 해시를 저장합니다. (계속) –

1

아마도 여기에 뭔가 빠졌 겠지만 매우 간단해야합니다. 암호를 해독하고 그에 따라 소금을 치고 salt + 사용자의 해독 된 암호 해시를 데이터베이스에 저장하는 프로세스를 만듭니다. 분명히 사용자의 암호화 된 암호를 해싱하고 싶지는 않습니다. 소금도 저장하는 것을 잊지 마십시오.

+0

그리고 명확히하기 위해, 당신은 비밀 번호의 끝에 소금을 가하고 있어야합니다 전에, 해쉬했을 때. ASP.NET Auth는 기본적으로 SHA1을 사용합니다. – kappasims

+0

나는 무엇을 해야할지 개념적으로 알고 있습니다. ASP.NET 멤버쉽에 대한 자세한 내용은 여러 가지 확실하지 않습니다. –

+0

("암호화 된"값을 입력하기 만합니다.) 사용자 "kappasims", 암호 "test". 암호화 된 암호 : 83 @ #! s34. 해독 된 암호 "test". "test"를 얻으려면 83 # @! s34를 해독하십시오. 무작위 소금 생성 : "12345". 그런 다음 "test12345"에 연결하십시오. SHA1을 사용하여 "test @ 12345"를 "! @ 83104234! @ # $ @ #"으로 해시합니다. "! @ 83104234! @ # $ @ #"을 해시로 저장하고 "12345"를 소금으로 저장하십시오. 비누 거품. 헹구기. 반복. – kappasims

3

암호를 해독하고 web.config 파일을 변경하는 방법을 이미 알고있는 것으로 보이지만 나머지 프로세스를 구현하는 방법에 익숙해졌습니다. ILSpy을 사용

, 여기에 각 사용자의 소금을 생성하는 방법은 다음과 같습니다

byte[] bytes = Encoding.Unicode.GetBytes(pass); 
byte[] array = Convert.FromBase64String(salt); 
byte[] array2 = new byte[array.Length + bytes.Length]; 
Buffer.BlockCopy(array, 0, array2, 0, array.Length); 
Buffer.BlockCopy(bytes, 0, array2, array.Length, bytes.Length); 
using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider()) { 
    return Convert.ToBase64String(sha1.ComputeHash(array2)); 
} 

pass가 plain-입니다 : 당신이 소금을 일단

byte[] array = new byte[16]; 
new RNGCryptoServiceProvider().GetBytes(array); 
return Convert.ToBase64String(array);  

, 여기에 비밀번호를 생성하는 방법 텍스트 비밀번호 이 계산되고 salt은 위의 첫 번째 코드 스 니펫에서 계산 된 문자열입니다. default algorithm is SHA1, 왜 이것이 사용되고 있는지 궁금하다면.

이것은 일회성 프로세스이므로 짧은 예약 유지 관리 기간 동안 수동으로 데이터베이스를 업데이트하는 HTTP 처리기를 작성합니다. (백업 및 테스트를 먼저 수행하십시오).당신이 aspnet_Membership 테이블의 다음 필드 업데이트해야합니다 :

  1. Password을 - 1
  2. PasswordSalt - -
  3. PasswordFormat 위의 계산

위의 계산 결코 이런 일을해야했다, 그러나 잘하면 그게 당신을 시작할 것입니다 :)

+0

차가움. 나는 당장이 일을 할 수 없지만 좋은 출발 같이 보인다. (실제로 ILSpy에 대해 듣기에 좋았습니다 .Red Gate가 .NET Reflector를 획득 했으므로 이제이 기능이 필요합니다!) –

+0

실제로 Red Gate는 .NET Reflector를 오래 전에 받았으며 모든 것이 정상이었습니다. http://kuujinbo.info/cs/dotnetReflectorIsDead.aspx). – kuujinbo

+0

예, 알고 있습니다. 그러나이 제품은 그 이후로 계속해서 사용되는 고통이 증가하고 있습니다. –

관련 문제