2017-03-06 3 views
1

내 사용자를 대표하는이 클래스가 그래서저장 암호

[HttpPost] 
Register(User newUser) 
{ 
    ... 
    _context.add(newUser); 
    await _context.SaveChangesAsync(); 
    ... 
} 

을 내 질문 : 저장하기 전에 일반 문자열에서 암호 유형을 변경해야합니까? 그렇다면 어떤 데이터 유형으로? 이것의 대부분은 보안 논의가 프로그래밍 한 것이 아니라 동안

답변

3

YES YES YES

는, 당신은 단지 보안 해시를 저장한다 (PBKDF2 및 Bcrypt는 일반 텍스트

로 암호를 저장하지 마십시오 현재 표준)와 그 해시에 사용 된 고유 한 소금.

그대로 저장하면 Password 열을 읽는 것보다 더 많은 노력없이 데이터베이스를 훔쳐서 모든 사용자 암호를 얻으라고 요청하는 것입니다.이 열은 아마도 다른 곳을 재사용했을 것입니다.

여전히 괜찮 으면 string으로 저장하십시오.

DataType.Password은 클래스 소비자가 읽을 수있는 주석입니다. (https://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.datatype(v=vs.110).aspx). 이 아닌은 저장소/데이터베이스 측면에서 보안을 강화합니다.

+0

클래스 속성에 대한 DataType (DataType.Password) 주석은 암호를 암호화하거나 해시하지 않습니다. – tocoolforscool

+0

@ j3ssi3ftw 내 편집보기 – BradleyDotNET

1

절대하지 말아야합니다. 데이터베이스에 암호를 저장하면 안됩니다. 가장 좋은 방법은 소금에 절인 해독 할 수없는 암호 해시를 저장하는 것입니다.

일반적으로 이것은 SHA2 또는 PBKDF2이거나 사용자에 대해 변경할 수없는 것으로 소금에 절인 모든 암호입니다. 레코드의 ID.

일반적으로 has는 해시 알고리즘에서 사용하는 varbinary (32) 또는 다른 길이로 저장합니다.

이 접근 방식은 되돌릴 수 없으므로 사용자 암호를 확인할 수 없음을 의미합니다. 로그인을 시도하는 사람의 암호를 테스트하려면 동일한 소금으로 동일한 해시를 수행하고 결과가 데이터베이스에있는 것과 동일한 지 테스트하십시오. 이렇게하면 데이터베이스를 가져 오는 해커가 각 사용자의 비밀번호가 무엇인지 파악할 수 없지만 사용자가 자신의 비밀번호를 알고 있는지 테스트 할 수 있습니다.

+0

DataType.Password DataAnnotation이 속성에 대해 수행하는 작업은 무엇입니까? – tocoolforscool

+1

MD5/SHA1의 문제는 반드시 충돌이 아니지만 (* a * 문제 임에도 불구하고) 소비자 하드웨어로 쉽게 깨뜨릴 수 있습니다. PBKDF2, BCrypt, SCrypt 등은 느리게 설계되어 있기 때문에 무차별 대입 공격은 훨씬 어렵습니다. (종종 특수화 된 FPGA가 필요합니다) – BradleyDotNET

+1

http://security.stackexchange.com/questions/19906/is-md5-considered를 참조하십시오. -insecure for more – BradleyDotNET