pbkdf2_sha256 C#实现

时间:2014-11-17 08:40:23

标签: c# security sha256 password-encryption pbkdf2

我有一个数据库,其中密码存储为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=

2 个答案:

答案 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变体,一大组测试向量,以及一个生成哈希值并可以检查结果的接口,如果那个例子可以帮助你。