我有一个数据库,其中密码存储为pbkdf2_sha256。 我想创建一个应该创建新密码的工具(在C#中)。
我的问题是:如何在C#中加密密码? 我发现Java-Class对我有用,但我不能在C#中使用这个示例。 是否有一种微笑的方式?
我也试过其他课程,但似乎没有用。
修改
我找到了C#的this类。但是当我调用ValidatePassword
- Method时,它返回false。 (密码和哈希是正确的)。
EDIT2: 我发现了this C#类,但它似乎没有用。我错了什么?
以下是我使用的代码:
var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;
using (var hmac = new HMACSHA256())
{
var df = new Pbkdf2(hmac, password, salt, interactions);
Console.WriteLine(BitConverter.ToString(df.GetBytes(32)));
Console.WriteLine(String.ByteArrayToString(df.GetBytes(32)));
Console.WriteLine(UTF8Encoding.UTF8.GetString(df.GetBytes(32)));
Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}
//hash I should get:
//pbkdf2_sha256$12000$FbSnXHPo12gb$LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=
//hash I get:
//Rc8oMeSrbWyIJ+aXvGegFowKcIlwk8eIRyxXUf/a+t0=
答案 0 :(得分:3)
不要将十六进制输出转换为base-64字符串,而是直接将字节转换为字符串。并且还注意到每个df.GetBytes调用都会获得新的字节。等效的例子是:
var salt = "FbSnXHPo12gb";
var password = "geheim";
var interactions = 12000;
using (var hmac = new HMACSHA256())
{
var df = new Pbkdf2(hmac, password, salt, interactions);
Console.WriteLine(Convert.ToBase64String(df.GetBytes(32)));
}
//hash I should get:
//pbkdf2_sha256$12000$FbSnXHPo12gb$LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=
//hash I get:
//LEpQrzPJXMI0m3tQuIE5mknqCv1GWgT5X2rWyLHN0Xk=
请注意,Java类有一个标题(“pbkdf2_sha256 $ 12000 $ FbSnXHPo12gb $”),而C#类只返回散列。
答案 1 :(得分:0)
我在Jither's PBKDF2 C# DeriveBytes code有一个my Github repository的分支,包括一个PBKDF2-HMAC-SHA-256变体,一大组测试向量,以及一个生成哈希值并可以检查结果的接口,如果那个例子可以帮助你。