我抬头一看MSDN和如何做到这一点的资源,但是我来到了没有明确的解决方案。 这是我发现的最好http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx?Redirected=true
我想使用散列或者bcrypt或PBKDF2(其似乎bcrypt相关的)在C#密码。 我喜欢它是如何多轮需要为我的电脑哈希密码进行试验。 然而一切似乎是约在大家对散列加密会谈。 我无法弄清楚。 我如何散列密码? 它看起来更像PBKDF2(Rfc2898?)是一个随机数发生器和我使用GetBytes会(量)来选择我的散列大小有多大。
我糊涂了。 究竟如何1散列与bcrypt / PBKDF密码吗?
Answer 1:
PBKDF2
你是非常接近实际。 你给的链接显示您如何调用Rfc2898DeriveBytes函数来获取PBKDF2哈希结果。 但是,由一个事实,即例如使用用于加密目的导出密钥(原动机PBKDF1和2是创建适合于使用作为加密密钥“密钥”导出函数)揭去。 当然,我们不希望使用的输出进行加密,但由于其自身的哈希值。
您可以尝试SimpleCrypto.Net如果你想PBKDF2出于这样的目的编写的库。 如果你看一下实现 ,你可以看到,它实际上只是一个简单包装的(你猜对了) Rfc2898DeriveBytes 。
BCrypt
您可以尝试命名为C#实现(还有什么) BCrypt.NET如果你想用这个变体实验。
免责声明:我没有使用或测试的任何,我已经联系到库...因人而异
Answer 2:
我花了永远 (天花天),以查找实际的代码来获得散列密码的工作! 所以我把它放在这里为了方便。
你需要阅读的文档和theory1 theory2 ,然后一些,或者你可以开到安全漏洞。 安全性是一个非常大的话题! 买家当心!
添加NuGet包BCrypt.Net的解决方案
const int WorkFactor = 14;
var HashedPassword = BCrypt.Net.BCrypt.HashPassword(Password, WorkFactor);
你应该调整WorkFactor到什么是适当的见的讨论 。 它是一种LOG2功能
“这个数字为log 2,这样每次电脑翻一番的速度,加1到默认的号码。”
然后你存储哈希密码在你的数据库作为passwordFromLocalDB
并测试传入的password
是这样的:
if (BCrypt.Net.BCrypt.Verify(password, passwordFromLocalDB) == true)
祝好运!
Answer 3:
今年早些时候,我一直在寻找到同样的事情对我们的ASP.NET Web窗体项目创建哈希,我想做同样的方式MVC项目做到开箱即用。
我偶然发现了这个问题=> ASP.NET身份默认的密码散列器,它是如何工作的,并且它的安全? 然后我发现与ByteArraysEqual方法的源此处=> http://www.symbolsource.org/MyGet/Metadata/aspnetwebstacknightly/Project/Microsoft.AspNet.Identity.Core/2.0.0-rtm-140327/Release/Default/ Microsoft.AspNet.Identity.Core / Microsoft.AspNet.Identity.Core / Crypto.cs?ImageName = Microsoft.AspNet.Identity.Core
Answer 4:
对于PBKDF2,您可能能够使用System.Security.Cryptography.Rfc2898DeriveBytes。
这里请参阅MSDN: http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx
Answer 5:
PBKDF2使用HMACSHA1,如果你想使用HMACSHA256或512键伸缩就像PBKDF2喜欢一个更现代和定制的解决方案,你应该看看这个API
https://sourceforge.net/projects/pwdtknet/
包含在源代码示例演示GUI如何从包括创建加密随机盐密码哈希.....享受:)
Answer 6:
PBKDF2
在该示例http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx ,当你到行“Rfc2898DeriveBytes K1 =新Rfc2898DeriveBytes(pwd1,salt1,myIterations); ” K1是哈希值。 究其原因,例子是加密是Rfc2898DeriveBytes的最初目的是创建加密密钥。
如果你不提供盐,Rfc2898DeriveBytes将创建它自己的,但我不知道是否RNGCryptoServiceProvider不会被加密的随机一个更好的工作。
根据OWASP( https://www.owasp.org/index.php/Using_Rfc2898DeriveBytes_for_PBKDF2 ),由Rfc2898DeriveBytes底层使用SHA1的意味着它是只对散列良好长度最多为160位。 如果您创建一个较长的哈希值,攻击者仍然只需要担心第160位,但你做密码散列/验证自己更加昂贵,没有增益。
下面是Rfc2898DeriveBytes密码哈希(存储在数据库中的哈希,盐和迭代)一些示例代码:
public class Rfc2898PasswordEncoder
{
private int _byteLength = 160 / 8; // 160 bit hash length
public class EncodedPassword
{
public byte[] Hash { get; set; }
public byte[] Salt { get; set; }
public int Iterations { get; set; }
}
public EncodedPassword EncodePassword(string password, int iterations)
{
var populatedPassword = new EncodedPassword
{
Salt = CreateSalt(),
Iterations = iterations
};
// Add Hash
populatedPassword.Hash = CreateHash(password, populatedPassword.Salt, iterations);
return populatedPassword;
}
public bool ValidatePassword(string password, EncodedPassword encodedPassword)
{
// Create Hash
var testHash = CreateHash(password, encodedPassword.Salt, encodedPassword.Iterations);
return testHash == encodedPassword.Hash;
}
public byte[] CreateSalt()
{
var salt = new byte[_byteLength]; // Salt should be same length as hash
using (var saltGenerator = new RNGCryptoServiceProvider())
{
saltGenerator.GetBytes(salt);
}
return salt;
}
private byte[] CreateHash(string password, byte[] salt, long iterations)
{
byte[] hash;
using (var hashGenerator = new Rfc2898DeriveBytes(password, salt, (int)iterations))
{
hash = hashGenerator.GetBytes(_byteLength);
}
return hash;
}
}
Answer 7:
我很感兴趣,不涉及任何图书馆的答案。
我读这篇文章https://crackstation.net/hashing-security.htm哪个环节在不同的语言C#的实现当中,我将在这里太链接
https://github.com/defuse/password-hashing/blob/master/PasswordStorage.cs
有趣的是,它使用Rfc2898DeriveBytes这里提到的几十倍。
private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes){
using (var pbkdf2 = new Rfc2898DeriveBytes(password, salt)) {
pbkdf2.IterationCount = iterations;
return pbkdf2.GetBytes(outputBytes);
}
}
文章来源: Hash Password in C#? Bcrypt/PBKDF2