2011-11-19 2 views
1

편도 해시 암호화로 연습하는 임.MVC 암호 속성 해시

MVC 모델이 Entity Framework와 있는데 암호 값을 저장하려고했습니다. 쓰기 전용 속성을 갖고 싶었지만 반환 값이 없다면 데이터베이스에 저장되지 않는다는 것을 발견했습니다. 편집보기를 방문 할 때마다 해시가 표시됩니다. 편집보기에서 빈 일반 암호 입력 필드를 사용하여이 문제를 해결할 수있었습니다.

사용자가 정보를 수정하고 암호를 변경하지 않고 (공백으로두면) 해당 속성의 값을 변경하지 않았더라도 암호 필드를 null로 설정하면 문제가 생깁니다.

누구나 더 좋은 방법을 제안 할 수 있습니까? 귀하의 답변에 미리 감사드립니다.

[DataType(DataType.Password), MaxLength(50)] 
    private string _Password; 
    public string Password 
    { 
     get 
     { 
      return _Password; 
     } 

     set 
     { 
      if(!string.IsNullOrEmpty(value)) 
      { 
      _Password = FormsAuthentication.HashPasswordForStoringInConfigFile(value, "MD5"); 
      } 
     } 

    } 
+1

'FormsAuthentication.HashPasswordForStoringInConfigFile'을 사용하지 마십시오. bruteforce 하기엔 너무 빠릅니다. 멤버십 클래스 또는 Rfc2898DeriveBytes를 사용하십시오. – CodesInChaos

답변

2

가장 좋은 방법은 엔티티 클래스에 두 개의 속성을 만드는 것입니다. 그 중 하나는 해시 된 암호를 나타내며 EF가 성공적으로 왕복 할 수 있도록 읽기/쓰기가됩니다. 해시에서 일반 텍스트를 복구하는 것이 합리적으로 불가능하기 때문에 해시 된 비밀번호를 읽기/쓰기로 제공하는 것이 안전합니다.

두 번째 속성은 암호 평문을 나타내야하며 쓰기 전용이어야합니다 (EF에서는 무시 됨). 설정자에서는 암호를 해시하고 다른 속성에 저장합니다. 사용자 암호를 변경하는 코드 만이 메소드에 액세스해야합니다.

마지막으로, 일반 텍스트 암호를 허용하고 해시 한 후 인증을 위해 해시 속성과 비교하는 Validate() 메서드를 만들어야합니다.

이 접근법을 사용하면 유효성 검사 속성 (예 : regex)을 적용하여 암호 편집기에서 바인딩을 위해 일반 텍스트 쓰기 전용 속성에 암호 복잡성 정책을 적용 할 수 있습니다. 쓰기 전용 속성을 사용하여 암호 고유성을 적용하고 빈도 정책을 변경하기 위해 암호 기록 하위 레코드를 생성 할 수도 있습니다.

또한 두 명의 다른 사용자가 사용하는 동일한 암호가 동일한 해시 값을 갖지 않도록 암호 해시를 소금 처리해야합니다 (이전에 사용자 GUID로 해본 적이 있습니다). 암호 해독을하기 전에 암호 평문을 사용자와 관련된 고유하지만 결정적 값과 연결하여 수행 할 수 있습니다.