scrypt和cryptsharp的示例代码
-
22-12-2019 - |
题
我已经在谷歌搜索,我找不到使用 cryptsharp 图书馆。
可以请提供用于散列密码的样本吗?
解决方案
它只是单一呼叫我会走过你的参数:
-
key
:这是您的密码,请使用UTF-8编码(没有字节顺序标记)将密码进行编码为字节数组; -
salt
:一串安全随机字节存储的scry函数的结果,16字节应该是充足的; -
cost
:给定的建议是262144,但如果您的服务器可以处理额外的负载,则可能希望增加该值; -
blockSize
:参见成本,给定的建议是8; -
parallel
:除非您想要尝试多线程,否则我会将其保持为1; -
maxThreads
:通常,null
会很好; -
derivedKeyLength
:嗯,这取决于密码128应该是充足的,但您的密码不太可能有超过128位的安全性。
你至少应该存放盐并结果。如果要将它们作为字符串存储,则可能需要使用Base 64编码。
我会建议您存储一个额外的数据:基于密码的密钥推导方案的版本(PBKDF)。说,将其设置为使用scrypt的生成扫描,使用给定的密钥编码,salt大小,成本,blocksize等。在这种情况下,您可以稍后升级您的方案(您需要用户提供他/她的密码来执行此操作,因此您将不得不在线执行此操作,因此您将最终同时进行多种方案)。
请注意,您可以将PBKDF函数调用链,因此您可以使用原始的PBKDF输出并将其用作下一个PBKDF的输入。在这种情况下,用户不必提供密码(此提示是在另一个问题上从CodesInchaOS中获取的)。
其他提示
@maartebbodewes提供了非常明智的额外提示的出色答案。这是一个带他的建议的代码样本。我还会建议阅读'你的密码太短'这表明使用现代密码学的重要性(在写作时)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);
}
. 不隶属于 StackOverflow