2011-09-01 7 views
-3

나는 이것을하기 위해 몇 가지 코드를 검색했지만 미리 정의 된 소금을 사용하여 일부를 발견했습니다. 각 사용자에 대해 자동으로 소금을 생성하고 소금 값을 테이블에 저장하려고합니다. 덕분에 나는 프로그래밍 새가 도와주세요 오전C에서 암호를 사용하여 암호 암호화 #

+0

정확히 무엇이 문제입니까? 당신은 당신이해야 할 일을 정확하게 처리하는 것처럼 보입니다. –

+1

"나는 프로그래밍에 익숙하지 않다."그리고 암호화와 관련된 모든 질문은 경고음을 울리게해야합니다. 암호화는 옳은 일을하는 것이 어려운 일이며, 이것에 대해 매우 신중할 것입니다. – RichK

답변

8

가 임의의 소금 생성 (제안, 나는 더 안전해야 뭔가 내 이전의 소금 생성 방법을 대체 한)

:

public static string GenerateRandomSalt(RNGCryptoServiceProvider rng, int size) 
{ 
    var bytes = new Byte[size]; 
    rng.GetBytes(bytes); 
    return Convert.ToBase64String(bytes); 
} 

var rng = new RNGCryptoServiceProvider(); 
var salt1 = GenerateRandomSalt(rng, 16); 
var salt2 = GenerateRandomSalt(rng, 16); 
// etc. 

RNGCryptoServiceProvider은 "암호 학적으로 강한 임의의 값"을 생성하는 데 사용되므로 표준 Random 클래스보다 여기에서 사용하기에 적합합니다. 당신이 소금을 생성하지만, 당신은 선택의 알고리즘을 사용하여 암호 해시에 추가 할 수 있습니다 :

var salt = GenerateRandomSalt(rng, 16); 
var hashedPassword = DoPasswordHashing(password + salt); 

그러나, 그것은 것보다 정확하게 사용자 인증을 수행하는 것이 더 어려운 문제가 될 수 있다는 지적 가치가있다. 에릭 리 퍼트 (Eric Lippert)는 몇 년 전에이 블로그에 대한 일련의 기사를 썼습니다. http://blogs.msdn.com/b/ericlippert/archive/2005/01/28/you-want-salt-with-that-part-one-security-vs-obscurity.aspx

+5

암호화와 관련된 * 임의의 작업에 임의 번호를 사용하지 마십시오. 암호로 보호되도록 설계되지 않았습니다. 공격은 레인보우 테이블 생성기가 무작위로 생성 될 가능성이있는 소금에 집중하여 공격자가 생성해야하는 테이블의 크기를 크게 줄이는 것입니다. ** 소금은 암호 학적으로 무작위로 유용해야합니다. ** –

+1

이것은 물론 사실입니다. 더 정확한 데모를 제공해야 할 시간이 필요했습니다. 이것이 RNGCryptoServiceProvider 클래스의 목적입니다. 맞습니까? –

+0

@ColeCampbell 예 여기에 RNGCryptoServiceProvider를 사용하는 것이 가장 좋습니다. – Dragon

관련 문제