我已经搜索了整个谷歌,但我找不到使用Cryptsharp库的Scrypt用法(用于散列密码)的代码样本。
你能提供一个散列密码的样本吗?
发布于 2013-11-19 04:25:52
它只是a single call,所以我将向您介绍参数:
key:这是你的密码,使用UTF-8编码(没有字节顺序标记)把你的密码编码成一个字节array;salt:一个安全的随机字节串,16字节应该是ample;cost:给出的建议是262144,但是如果你的服务器能处理额外的load;blockSize:,你可能想增加这个值请看开销,给出的建议是8;parallel:我会将其设置为1,除非您想要尝试使用multi-threading;maxThreads:一般情况下,null会做得很好,这取决于密码128应该是足够的,但您的密码不太可能具有超过128位的安全性。您应该至少存储盐和结果。如果要将它们存储为字符串,则可能需要使用base64编码。
我建议您存储一个额外的数据:基于密码的密钥派生方案(PBKDF)的一个版本。在这种情况下,你可以在以后升级你的方案(你需要用户提供他/她的密码来做这件事,所以你必须在线做这件事,所以你最终会有多个方案同时运行)。
请注意,您可以链接PBKDF函数调用,因此可以使用原始PBKDF输出,并将其用作下一个PBKDF的输入。在这种情况下,用户不必提供密码(此提示取自CodesInChaos对另一个问题的提示)。
发布于 2016-01-12 16:54:46
@MaartebBodewes提供了一个非常好的答案,并提供了非常明智的附加提示。以下是他的建议的代码示例。我还建议阅读“Your password is too damn short”,它展示了使用现代密码学的重要性,比如(在撰写本文时) BCrypt或Scrypt。
public string Hash(string secret, string salt)
{
var keyBytes = Encoding.UTF8.GetBytes(secret);
var saltBytes = Encoding.UTF8.GetBytes(salt);
var cost = 262144;
var blockSize = 8;
var parallel = 1;
var maxThreads = (int?)null;
var derivedKeyLength = 128;
var bytes = SCrypt.ComputeDerivedKey(keyBytes, saltBytes, cost, blockSize, parallel, maxThreads, derivedKeyLength);
return Convert.ToBase64String(bytes);
}https://stackoverflow.com/questions/20042977
复制相似问题