【问题标题】:pbkdf2_sha256 C# implementationpbkdf2_sha256 C# 实现
【发布时间】:2020-02-06 13:22:41
【问题描述】:

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

【问题讨论】:

  • 第一个使用SHA1。

标签: c# security sha256 password-encryption pbkdf2


【解决方案1】:

不要将十六进制输出转换为 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# 类只返回哈希。

【讨论】:

    【解决方案2】:

    我在my Github repository 有一个Jither's PBKDF2 C# DeriveBytes code 的分支,包括一个 PBKDF2-HMAC-SHA-256 变体、大量测试向量以及一个既可以生成散列又可以检查结果的接口(如果该示例)帮助你。

    【讨论】:

      猜你喜欢
      • 2018-02-14
      • 2013-07-06
      • 2019-01-07
      • 2021-01-14
      • 2011-05-16
      • 2021-03-14
      • 2013-04-16
      • 2013-06-30
      • 2013-11-19
      相关资源
      最近更新 更多