C\#Salt+Hash 를 사용 하여 암 호 를 암호 화 합 니 다.

6095 단어 C#암호 화
(1)왜 해시 함수 로 비밀 번 호 를 암호 화 합 니까?
만약 에 비밀번호(예 를 들 어 사이트 사용자 의 비밀번호)를 저장 해 야 한다 면 이 암호 데 이 터 를 어떻게 보호 하 는 지 고려 해 야 합 니 다.아래 처럼 비밀 번 호 를 데이터베이스 에 직접 기록 하 는 것 은 매우 안전 하지 않 습 니 다.데이터 베 이 스 를 열 수 있 는 모든 사람 이 이 비밀 번 호 를 직접 볼 수 있 기 때 문 입 니 다.

해결 방법 은 암 호 를 암호 화한 후에 데이터베이스 에 저장 하 는 것 이다.비교적 자주 사용 하 는 암호 화 방법 은 해시 함수(Hash Function)를 사용 하 는 것 이다.해시 함수 의 구체 적 인 정 의 는 인터넷 이나 관련 서적 에서 찾 아 볼 수 있 습 니 다.쉽게 말 하면 그 특성 은 다음 과 같 습 니 다.
(1)원시 암 호 는 해시 함수 로 계산 한 후 해시 값 을 얻는다.
(2)원본 비밀 번 호 를 바 꾸 면 해시 함수 가 계산 한 해시 값 도 이에 따라 달라 집 니 다.
(3)같은 비밀번호,해시 값 도 같다.
(4)해시 함 수 는 단 방향 이 고 거 스 를 수 없다.즉,해시 값 에서 원본 비밀번호 가 얼마 인지 계산 할 수 없다 는 것 이다.
해시 함수 가 있 으 면 우 리 는 암호 의 해시 값 을 데이터베이스 에 저장 할 수 있다.사용자 가 사이트 에 로그 인 할 때,우 리 는 사용자 가 비밀 번 호 를 입력 한 해시 값 이 데이터베이스 에 있 는 해시 값 과 같 는 지 확인 할 수 있다.

해시 함 수 는 거 스 를 수 없 기 때문에 누군가가 데이터 베 이 스 를 열 어도 사용자 의 비밀번호 가 얼마 인지 볼 수 없습니다.
그렇다면 해시 함수 로 암호 화 된 비밀 번 호 를 저장 하 는 것 이 안전 한 것 일 까?우 리 는 먼저 몇 가지 흔히 볼 수 있 는 비밀 번 호 를 푸 는 방법 을 살 펴 보 자.
(2)몇 가지 흔히 볼 수 있 는 암호 해독 방법
가장 간단 하고 흔히 볼 수 있 는 해독 방식 은 사전 해독(Dictionary Attack)과 폭력 해독(Brute Force Attack)방식 이다.이 두 가지 방법 은 말하자면 비밀 번 호 를 맞 추 는 것 이다.

사전 해독 과 폭력 해독 은 모두 효율 이 비교적 낮은 해독 방식 이다.데이터베이스 에 있 는 암호 의 해시 값 을 알 게 된다 면 더 효율 적 인 해독 방식 으로 표 법(Lookup Tables)을 찾 을 수 있 습 니 다.역방향 체크 표 법(Reverse Lookup Tables),무지개 시계(Rainbow Tables)등 도 체크 표 법 과 대동소이 하 다.이제 표 법의 원 리 를 살 펴 보 자.
체크 표 법 은 사전 해독 과 폭력 해독 처럼 비밀 번 호 를 맞 히 지 않 는 다.먼저 자주 사용 하 는 암호 의 해시 값 을 계산 한 다음 에 시 계 를 만 들 었 다.물론 비밀번호 가 많 을 수록 이 시 계 는 커진다.어떤 암호 의 해시 값 을 알 고 있 을 때,당신 이 만 든 표 에서 이 해시 값 을 찾 아야 합 니 다.찾 으 면 해당 하 는 비밀 번 호 를 알 수 있 습 니 다.

(3)비밀번호 에 소금 넣 기(Salt)
위의 체크 표 법 을 통 해 알 수 있 듯 이 원본 비밀 번 호 를 암호 화한 해시 값 을 데이터베이스 에 저장 하 는 것 은 안전 하지 않다.그렇다면 어떤 좋 은 방법 으로 이 문 제 를 해결 할 수 있 습 니까?정 답 은 소금 을 넣 는 것 이다.
소금(Salt)이 뭐 예요?무 작위 로 생 성 된 문자열 입 니 다.우 리 는 소금 을 원본 암호 와 연결(concat)한 다음(앞 이나 뒤에 놓 아 도 됩 니 다)concat 뒤의 문자열 을 암호 화 합 니 다.이런 방식 으로 비밀 번 호 를 암호 화하 면 표 검사 법 이 효과 가 없다.

(4).NET 에서 의 실현
.NET 에서 생 성 염 은 RNGCrypto ServiceProvider 클래스 를 사용 할 수 있 으 며,당연히 GUID 도 사용 할 수 있다.해시 함수 의 알고리즘 은 SHA(Secure Hash Algorithm)가족 알고리즘 을 사용 할 수 있 습 니 다.물론 해시 함수 의 알고리즘 은 매우 많 습 니 다.예 를 들 어 MD5 를 사용 할 수 있 습 니 다.참고 로 미국 정 부 는 예전 에 SHA-1 알고리즘 을 광범 위 하 게 사 용 했 는데 2005 년 에 중국 산 둥 대학의 왕 샤 오 윈 교수 에 의 해 안전 결함 이 발견 되 었 기 때문에 현 재 는 SHA-1 가 장 된 변종,예 를 들 어 SHA-256 을 자주 사용 하고 있다..NET 에 서 는 SHA 256 Managed 클래스 를 사용 할 수 있다.
다음은.NET 에서 암호 에 소금 을 넣 어 암호 화 하 는 방법 을 보 여 주 는 코드 입 니 다.암호 화 된 암 호 는 MySQL 데이터베이스 에 저 장 됩 니 다.

다음 코드 는 새 계 정 을 등록 하 는 방법 을 보 여 줍 니 다.소금 생 성 은 뉴 가 이 드 를 사용 할 수도 있 고 RNGCrypto ServiceProvider 클래스 를 사용 할 수도 있다.byte[]를 string 으로 변환 합 니 다.Base64String 을 사용 할 수도 있 고 아래 ToHexString 방법 을 사용 할 수도 있 습 니 다.

protected void ButtonRegister_Click(object sender, EventArgs e) 
{ 
 string username = TextBoxUserName.Text; 
 string password = TextBoxPassword.Text; 
 // random salt 
 string salt = Guid.NewGuid().ToString();
 // random salt 
 // you can also use RNGCryptoServiceProvider class  
 //System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider(); 
 //byte[] saltBytes = new byte[36]; 
 //rng.GetBytes(saltBytes); 
 //string salt = Convert.ToBase64String(saltBytes); 
 //string salt = ToHexString(saltBytes); 
 byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt);  
 byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes);
 string hashString = Convert.ToBase64String(hashBytes);
 // you can also use ToHexString to convert byte[] to string 
 //string hashString = ToHexString(hashBytes); 
 var db = new TestEntities(); 
 usercredential newRecord = usercredential.Createusercredential(username, hashString, salt); 
 db.usercredentials.AddObject(newRecord); 
 db.SaveChanges(); 
}
string ToHexString(byte[] bytes) 
{ 
 var hex = new StringBuilder(); 
 foreach (byte b in bytes) 
 { 
 hex.AppendFormat("{0:x2}", b); 
 } 
 return hex.ToString(); 
} 
다음 코드 는 로그 인 사용자 의 비밀번호 가 정확 한 지 확인 하 는 방법 을 보 여 줍 니 다.먼저 사용자 이름 이 존재 하 는 지 확인 하고 존재 한다 면 이 사용자 의 소금 을 얻 은 다음 에 이 소금 과 사용자 가 입력 한 비밀번호 로 해시 값 을 계산 하고 데이터베이스 에 있 는 해시 값 과 비교 합 니 다.

protected void ButtonSignIn_Click(object sender, EventArgs e) 
{ 
 string username = TextBoxUserName.Text; 
 string password = TextBoxPassword.Text;
 var db = new TestEntities(); 
 usercredential record = db.usercredentials.Where(x => string.Compare(x.UserName, username, true) == 0).FirstOrDefault(); 
 if (record == default(usercredential)) 
 { 
 throw new ApplicationException("invalid user name and password"); 
 }
 string salt = record.Salt; 
 byte[] passwordAndSaltBytes = System.Text.Encoding.UTF8.GetBytes(password + salt); 
 byte[] hashBytes = new System.Security.Cryptography.SHA256Managed().ComputeHash(passwordAndSaltBytes); 
 string hashString = Convert.ToBase64String(hashBytes);

 if (hashString == record.PasswordHash) 
 { 
 // user login successfully 
 } 
 else 
 { 
 throw new ApplicationException("invalid user name and password"); 
 } 
}
요약:해시 함수 만 사용 하여 암호 화 하 는 것 은 부족 합 니 다.암호 에 소금 을 넣 어 안전성 을 높 여야 합 니 다.소금의 길 이 는 너무 짧 으 면 안 되 고 소금의 생 성 은 무 작위 여야 합 니 다.
이상 은 본 고의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.또한 저 희 를 많이 지지 해 주시 기 바 랍 니 다!

좋은 웹페이지 즐겨찾기