2013-02-27 3 views
1

사용자 등록시 내 데이터베이스에 저장할 암호/해시 암호를 제공하는 간단한 암호 암호화 기가 있습니다. 코드 : 사용자가 로그인 할 때 암호화 로그인시 해시 된 & 암호가있는 암호 비교

public static string GenerateHashWithSalt(string enteredPassword, string enteredSalt) 
    { 
     string sHashWithSalt = enteredPassword + enteredSalt; 
     byte[] saltedHashBytes = Encoding.UTF8.GetBytes(sHashWithSalt); 
     System.Security.Cryptography.HashAlgorithm algorithm = new System.Security.Cryptography.SHA256Managed(); 
     byte[] hash = algorithm.ComputeHash(saltedHashBytes); 
     return Convert.ToBase64String(hash); 
    } 

, 나는 단순히 다시이 코드를 통해 입력 한 암호를 넣고 그것이 나에게 다른 결과를 줄 것 같은 비교할 수 없습니다 추정. 간단히은 저장된 비밀번호와 입력 된 로그인 비밀번호를 비교할 수 있습니까?

+1

절인 + 해시 암호와 비교 어쩌면 내가 제대로 내 암호화 교훈을 기억하지 않는다, 그러나 당신이 당신이 사용자의 암호를 얻을 때 소금, 무엇을해야하는지 정확히하고 있고, DB에. 그것은 같은 문자열이어야합니다. 무작위성은 완전히 결정론적인 기능입니다. – OopsUser

+0

해시 알고리즘은 멱등수입니다. 동일한 입력 = 같은 출력이 출력됩니다. –

+3

단일 반복 SHA-256은 적절한 암호 해시가 아닙니다. 나는'Rfc2898DeriveBytes' 클래스를 사용하여 최소한 10000 반복의 PBKDF2를 사용할 것입니다. – CodesInChaos

답변

5

계정을 만들 때 암호가 제공되는 GenerateHashWithSalt(password, salt);으로 채워지고 소금이 임의로 생성되는 password hash 열이 있습니다. 소금은 암호 해시와 함께 저장됩니다.

그런 다음 사용자 이름/비밀번호가 유효한지 확인해야하는 경우 storedpassword == GenerateHashWithSalt(providedPassword, saltFromDb) 또는 일부를 사용하십시오. 그들은 같은 나올 경우에, 당신은, 어쩌면이 도움이 될 것입니다 당신이 필요로하는 모든 암호를 비교하는 방법 인 경우가 올바른 암호

+0

이것은 완벽하게 고마워했습니다. 나는 또한 해시 길이에 약간의 문제가 있었는데, 데이터베이스는 25자를 사용하고 있었다. 해시 값은 너무 커서 일치하지 않았다. 그러나, 나는이 문제도 해결했다. 다시 고마워. – ZeeeeeV

+0

@ ZeeeeeV 나는 너의 자신의 인증을 쓰는 것에 아주 조심스럽게 말할 것이다. 매우 까다 롭고 작동하는 것처럼 보이지만 나중에 사용자 계정 정보가 새어 나가는 미묘한 문제가 있습니다. 또한 해시를 25 자로 트리밍하여이 문제를 해결했다면 기본적으로 해시가 약 해지고 있습니다. 데이터베이스 열을 확장하거나 새로운 암호를 작성하십시오. – Earlz

0

가 제대로이 작업을 수행하는 몇 가지 단계가 있습니다 . 사용자가 제공

  1. 암호 :

    먼저 당신은 3 가지가 필요합니다. (p)

  2. 생성 한 임의의 문자 스트링. 이것은
  3. 암호화 해시 함수 (우리가 를 호출 것) 소금으로 알려져있다 (물론 호출 시간 (X)) 우리가 시간을 계산할 수 있습니다 위의 세 가지로

'우리가 저장하고 싶은 것입니다 : 시간' = 시간 ( + 페이지)

을 사용자의 암호는 절대로 저장되지 않습니다. 데이터베이스에는 및 h '만 저장합니다.

소금을 암호화 할 필요가 없습니다. 데이터베이스의 모든 암호에 대해 고유해야합니다.

사용자가 나중에 다시 로그인하려고하면 데이터베이스에 저장된 원래 소금을 사용하여 h '을 다시 계산합니다. 새로운 h '가 데이터베이스에있는 것과 동일한 경우 사용자의 암호는 동일합니다.

2

솔트 해시 암호와 동일한 스키마가 작동하는 방법에 대한 빠른 자습서를 작성했습니다. 그러나 질문을한다는 사실에 근거하여 나는 이라는 보안 문자를 사용하여 보안 로그온 프로세스를 보장하는 첫 단계 일뿐입니다.. 초보자 인 경우 보안 전문가를 고용하거나 자신의 솔루션을 롤업하려고 시도하지 않고 기성품을 구매해야합니다.시스템을 안전하지 않게 만드는 명백한 실수를하는 방법의 수는 이라고 엄청납니다.입니다.

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

+1

문서를 보내 주셔서 감사합니다. 확실히 해싱 암호에 대한 지식을 널리 알리는 데 도움이됩니다. 아마도 "현대"MD5를 BCrypt 또는 PBKDF2와 같은 키 유도 함수로 교환 할 수 있습니다. 그러면 해시가 훨씬 안전 해집니다. – martinstoeckli