2011-09-01 143 views
-3

我搜索了一些代码,但是发现了一些预定义的盐。我想为每个用户自动生成salt并将salt值存储在表中。由于我是新来的编程请帮助在c中使用salt加密密码#

+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