2

잠시 동안이 문제가 발생했습니다. 나는 사용자가 입력 한 단어를 회원 DB에있는 암호와 비교할 필요가있다. 암호는 해시되고 소금입니다. 설명서가 부족하기 때문에 소금이 암호에 추가 된 다음 암호가 어떻게 생성되는지 해시할지 여부는 알 수 없습니다.ASP.NET 회원 C# - 기존 암호/해시 비교 방법

일치하지 않을 수 있습니다. 함수에서 반환 된 해시는 DB의 해시와 일치하지 않으며 사실 동일한 암호임을 알고 있습니다. Microsoft는 다른 방법으로 암호를 해시하는 것 같습니다.

누군가 통찰력을 가지길 바랍니다.

여기 내 코드입니다 :

protected void Button1_Click(object sender, EventArgs e) 
    { 
     //HERE IS THE PASSWORD I USE, SAME ONE IS HASHED IN THE DB 
     string pwd = "Letmein44"; 
     //HERE IS THE SALT FROM THE DB 
     string saltVar = "SuY4cf8wJXJAVEr3xjz4Dg=="; 
     //HERE IS THE PASSWORD THE WAY IT STORED IN THE DB AS HASH 
     string bdPwd = "mPrDArrWt1+tybrjA0OZuEG1P5w="; 
    // FOR COMPARISON I DISPLAY IT 
     TextBox1.Text = bdPwd; 
     // HERE IS WHERE I DISPLAY THE return from THE FUNCTION, IT SHOULD MATCH THE PASSWORD FROM THE DB. 
     TextBox2.Text = getHashedPassUsingUserIdAsSalt(pwd, saltVar); 

    } 
private string getHashedPassUsingUserIdAsSalt(string vPass, string vSalt) 
    { 
     string vSourceText = vPass + vSalt;   
     System.Text.UnicodeEncoding vUe = new System.Text.UnicodeEncoding(); 
     byte[] vSourceBytes = vUe.GetBytes(vSourceText);    
     System.Security.Cryptography.SHA1CryptoServiceProvider vSHA = new System.Security.Cryptography.SHA1CryptoServiceProvider(); 
     byte[] vHashBytes = vSHA.ComputeHash(vSourceBytes);    
     return Convert.ToBase64String(vHashBytes); 
    } 

답변

8

리플렉터와 같은 도구를 사용하면 멤버 자격 공급자가 무엇을 볼 수 있습니다. 이 나를 위해 과거에 근무하고 무엇은 (passwordFormat 1, 즉 SHA1을 가정) :

public static string GenerateHash(string pwd, string saltAsBase64) 
{ 
    byte[] p1 = Convert.FromBase64String(saltAsBase64); 
    return GenerateHash(pwd, p1); 
} 

public static string GenerateHash(string pwd, byte[] saltAsByteArray) 
{ 
    System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider(); 

    byte[] p1 = saltAsByteArray; 
    byte[] p2 = System.Text.Encoding.Unicode.GetBytes(pwd); 

    byte[] data = new byte[p1.Length + p2.Length]; 

    p1.CopyTo(data, 0); 
    p2.CopyTo(data, p1.Length); 

    byte[] result = sha.ComputeHash(data); 

    string res = Convert.ToBase64String(result); 
    return res; 
} 

경우 : "saltAsBase64는"aspnet_Membership 테이블의 PasswordSalt 열에서입니다.

편집 :

사용 예제 :

 string pwd = "Letmein44"; 
     string saltAsBase64 = "SuY4cf8wJXJAVEr3xjz4Dg=="; 

     string hash = GenerateHash(pwd, saltAsBase64); 
     // hash : "mPrDArrWt1+tybrjA0OZuEG1P5w="  
+0

@ 모에, 당신은 최고입니다, 당신은 나를 구 했어요. 나는 너에게 고마워하는 방법을 모른다. 할 수있는 것이 있다면 이름을 지어주세요. 여러분 모두에게 감사드립니다. 여러분 모두는 매우 도움이되었습니다. 나는 언젠가 당신만큼 좋고 다른 사람들을 도울 수 있기를 바랍니다. Steve – Steve

+1

위 코드를 해시하고 보안 답변을 비교하는 경우 SqlMembershipProvider가 수행하는 'passwordAnswer.ToLower (CultureInfo.InvariantCulture)'를 반드시 수행하십시오. ToLower()가 없으면 계산 된 해시는 저장된 보안 해시와 다를 수 있습니다. –

2

그래서 많은 작업! Microsoft는 삶을 훨씬 편하게 만듭니다.

문자열 myhash = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile (password + salt, "SHA1");

+0

나는 이것이 그 op가 무엇인지 생각하지 않는다. 사용자의 원시 암호와 base64로 인코딩 된 salt (aspnet_Membership 테이블의 PasswordSalt 열에서)를 받으면 aspnet_Membership 테이블 행의 Password 열을 생성 할 수 있어야합니다. 그것은 편리한 기능처럼 보일지라도, 정확히는 그렇게하지 않는 것 같습니다. –

+0

정확합니다. 첫눈에 보이는 일에 잘 보였습니까? 나는 그것이 마음에 곧바로 오지 않는 이유라고 생각합니다. –