2012-01-19 3 views
0

일부 C# 보안 코드로 작업 중이며 HMACSHA1 클래스를 사용하고있을 때 대체하려고합니다. 코드는 데이터베이스에 저장하기 위해 암호를 해싱하는 데 사용됩니다. 내 눈을 사로 잡은 점은 해시를 정확히 계산하는 HMAC 키로 암호를 사용한다는 것입니다. 그래서 키와 해시 모두에 대한 데이터를 사용하고 있습니까? 이로 인해 보안이 강화되거나 약화됩니까?HMAC SHA1에서 키와 메시지에 동일한 값 사용

사이비 코드 :

string pwd = "[email protected]#123$"; 

using (HMACSHA1 hasher = new HMACSHA1()) 
{ 
    hasher.Key = encoding.GetBytes(pwd); // using password for the key 
    return BytesToHex(hasher.ComputeHash(encoding.GetBytes(pwd))); // computing the hash for the password 
} 

답변

3

그것은 두 반복과 무염 SHA1 해시만큼이나 강하다. 꽤 약하다.

소금이 부족하여 무지개 테이블을 만들거나 데이터베이스의 모든 암호 해시를 동시에 공격 할 수 있습니다.

반복 횟수가 적 으면 공격자가 더 많은 암호 후보를 시도 할 수 있으므로 공격이 빨라집니다.

소금을 추가하고 PBKDF2 및 bcrypt와 같은 더 느린 해싱 방법을 사용해야합니다. .net 클래스 Rfc2898DeriveBytes은 PBKDF2를 구현하므로이 중 하나를 사용하는 것이 좋습니다.

1

데이터베이스 암호 저장을 위해 HMACSHA1을 권장하지 않지만이 키를 암호와 같게 설정하면이 목적으로 키의 유용성이 약화됩니다. 키는 비밀로되어 있으며 기본 해시 데이터가 변경되었는지 확인하는 데 사용됩니다.

암호의 경우 해시 알고리즘의 보안을 강화하려면 SALT + 암호 조합을 사용해야합니다. 일반적으로 사용자 고유의 소금을 사용하지만 사용자 번호 나 초기 등록 IP 주소와 같은 암호는 아닙니다.

또한 SHA1은 더 이상 해싱 알고리즘으로 권장되지 않습니다.

더 명확한 이해를 위해 MSDN을 참조 할 수 있습니다.

이 속성은 키 해시 알고리즘의 핵심입니다.

해시 기반 메시지 인증 코드 (HMAC)는 비보안 채널을 통해 전송 된 메시지는 변조를 되었는지 확인 에 사용될 수있는 송신기 및 수신기를 공유 비밀 키 한한다. 보낸 사람이 원래 데이터의 해시 값을 계산하고 은 원본 데이터와 HMAC를 단일 메시지로 보냅니다. 수신기는 수신 된 메시지의 해시 값을 다시 계산하고 계산 된 해시 값이 전송 된 해시 값과 일치하는지 확인합니다 ( ).

HMAC는 MD5 또는 SHA-1 같은 과 같은 반복적 인 암호화 해시 함수와 함께 비밀 공유 키와 함께 사용할 수 있습니다. HMAC의 암호화 강도는 기본 해시 함수 의 속성에 따라 다릅니다.

메시지를 변경하고 올바른 해시 값을 재현하려면 비밀 키에 대한 지식이 필요하므로 데이터 또는 해시 값을 변경하면 불일치가 발생합니다 ( ). 따라서 원본 및 계산 된 해시 값이 일치하면 메시지가 인증됩니다.

관련 문제