2016-06-10 4 views
0

.NET (C#) 클라이언트에서 CryptSharp Library을 사용하여 무작위로 생성 된 소금 (Blowfish)으로 사용자의 암호를 해시합니다.C#에서 임의의 소금으로 해싱 하시겠습니까?

그런 다음 해쉬 된 암호를 MySQL 데이터베이스에 저장된 원격 서버로 보내십시오.

동일한 일반 텍스트 암호를 사용하여 로그인을 시도하면 보낸 내용과 데이터베이스에 저장된 내용간에 해시가 일치하지 않습니다. (대부분 소금이 매번 바뀌기 때문에)

PHP 끝 부분에 암호화되지 않은 일반 텍스트 암호를 보내지 않으려 고합니다. 정적 소금을 사용하지 않고 어떻게 이것을 할 수 있습니까?

해싱 (C 번호) :

string passHash = Crypter.Blowfish.Crypt(Password.Text, Crypter.Blowfish.GenerateSalt()); 

내가 등록시 클라이언트의 소금을 저장하는 새 열을 생성해야하지 선호하지만, 내가해야 내가됩니다 것입니다.

+0

왜 당신이 사용하는 복어? .NET 프레임 워크에서 직접 해시를 생성하는 다른보다 간단한 방법이 있습니다. Blowfish를 사용하는 특별한 이유가 있습니까? –

+0

Bcrypt (Blowfish)가 아니라면 무엇을 권하고 싶습니까? – user1954141

+0

SHA1Managed에서 .NET Framework를 사용하십시오. 아래 답변을 참조하십시오. –

답변

0

대답은 아주 간단하고 유엔 관련 사용되는 언어이다 : (나는 '서버가 데이터베이스에 해시 암호를 저장하려면

  1. , 당신은 어떤 해시 함수로 저장할 수 있습니다 d brute-forcing이 오래 걸리도록하려면 SHA256 또는 BCrypt를 권장합니다 .BCrypt의 장점은 소금과 반복 횟수가 해시에 직접 저장되므로 데이터베이스에 별도의 열이 필요하지 않음입니다.

  2. 소금을 뿌리고 싶다면 염분 열을 저장하고 해싱 중에 사용할 클라이언트에 전송해야합니다. 일반적으로 각 사용자마다 무작위 소금을 사용하며 암호가 변경 될 때만 변경됩니다. 이것은 권장 사항이지만 꼭 필요한 것은 아닙니다. 무지개 표 공격을 쓸모 없게 만듭니다.

  3. 전선을 통한 전송 및 특히 데이터베이스에 대한 전송이 걱정되면 인증하는 동안 서버에서 임의의 소금을 생성하여 한 번만 사용하면되지만 서버는 원래의 암호가 필요합니다 비교하려고.

어디서나 표준 연습이라고 생각하지 않지만이 모든 방법을 결합 할 수도 있습니다.

0

이를 사용할 수 있습니다 ToHex는 다음과 같습니다

var result = string.Empty; 
using (var sha1 = new SHA1Managed()) 
{ 
    result = ToHex(sha1.ComputeHash(Encoding.ASCII.GetBytes(Password.Text))); 
} 

가 : 염을 요구하지 않고라고 여러 번이 관여 할 때

public static string ToHex(byte[] bytes) 
{ 
    return string.Concat(bytes.Select(b => b.ToString("X2"))); 
} 

이전 코드가 동일한 해시를 생성 않습니다.

SHA256Managed과 같이 .NET 프레임 워크에서 지원되는 SHA 알고리즘의 다른 보안 버전이 있습니다. SHA1 또는 SHA256 사용은 보안 요구 사항에 따라 다릅니다.

+0

이것은 암호를 저장할 수있는 매우 안전하지 않은 방법이며 해시가 소금에 절인 것이 아니며 해시에 필요한 시간을 제어하는 ​​반복도 없습니다. 이러한 해시는 너무 쉽게 무차별 적으로 강제 될 수 있습니다 (약 5 기가/초). – martinstoeckli

0

암호화 된 암호의 목적은 데이터베이스에 암호를 안전하게 저장하는 것입니다. CryptSharp는 전선을 통한 전송 보안을 유지하는 데 도움이되지 않습니다.

취할 수있는 접근 방법이 많이 있지만 가장 쉬운 방법은 SSL을 통해 서버와 통신하는 것입니다.공용 CA를 사용하지 않으려면 자체 서명 된 인증서를 사용하고 ServicePointManager.ServerCertificateValidationCallback을 연결하여 자신의 CA 또는 인증서를 승인하십시오.

0

클라이언트에서 서버로 암호를 전송하려면 암호화 된 HTTPS/SSL 연결이 필요합니다. 사용자 입력을 클라이언트에 보내기 전에 암호화하여 ManInTheMiddle을 도청 할 수 없습니다. 해싱은 적어도 해싱의 일부인 서버 측에서 수행되어야합니다.

CryptSharp는 공통 저장 형식을 지원하며 결과 해시에 소금을 포함합니다. 불행히도 검증을위한 방법이 존재하지 않는 것 같습니다. 적어도 사용한 소금을 추출 할 수는 있습니다. 내가 추천 할 수

또 다른 라이브러리는 BCrypt.Net 인 소금은 해시 (추가 필드에 대한 필요성)과 함께이 저장되고 검증은 매우 간단합니다 : BCrypt.Verify(password, stored_hash)