首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C#中的哈希密码?Bcrypt/PBKDF2

C#中的哈希密码?Bcrypt/PBKDF2
EN

Stack Overflow用户
提问于 2012-07-10 20:01:25
回答 9查看 51.5K关注 0票数 43

我查阅了msdn和其他资源,了解如何做到这一点,但我没有提出明确的解决方案。这是我找到的最好的http://blogs.msdn.com/b/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx?Redirected=true

我想在C#中使用bcrypt或PBKDF2 (似乎与bcrypt相关)对密码进行哈希处理。我喜欢试验我的计算机需要多少轮次来散列一个密码。然而,似乎所有的事情都是关于加密的,而每个人都在谈论哈希。我想不出来。如何对密码进行哈希处理?它看起来更像PBKDF2 (Rfc2898?)是一个随机数生成器,我使用GetBytes(数量)来选择我的散列大小。

我很困惑。如何使用bcrypt/PBKDF对密码进行哈希处理?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2012-07-10 20:28:07

PBKDF2

你们真的很亲近。您给出的链接向您展示了如何调用Rfc2898DeriveBytes函数来获得PBKDF2散列结果。但是,这个示例使用派生密钥进行加密( PBKDF1和2最初的动机是创建适合用作加密密钥的“密钥”派生函数),这让您大吃一惊。当然,我们不希望将输出用于加密,而是将其本身用作散列。

如果需要PBKDF2,可以尝试为此目的编写的SimpleCrypto.Net库。如果你使用look at the implementation,你可以看到它实际上只是(你猜对了) Rfc2898DeriveBytes的一个薄薄的包装器。

BCrypt

如果您想尝试这个变体,可以尝试名为(还有什么) BCrypt.NET的C#实现。

免责声明:我没有使用或测试过我链接到的任何库...YMMV

票数 37
EN

Stack Overflow用户

发布于 2019-07-09 17:37:46

首先,我敦促大家使用平台本身包含的经过加密验证的参考算法。

不要使用第三方软件包和未经验证的开放源码软件组件、或任何其他你刚刚从互联网上复制粘贴的代码。

对于.NET ,请使用PBKDF2,而不是bCrypt,因为没有针对.NET的bCrypt认证实施

我不是不尊重任何高尚的开源开发者(我自己也是),但你永远不能确定他们的网站在10年内不会被黑客入侵,最终你会从Nuget/npm或其他包管理器那里得到一个恶意软件包。

有关验证的更多信息,请访问this SO answer

现在,回到PBKDF2,下面是简单的代码

代码语言:javascript
代码运行次数:0
运行
复制
public static byte[] PBKDF2Hash(string input, byte[] salt)
{
    // Generate the hash
    Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(input, salt, iterations: 5000);
    return pbkdf2.GetBytes(20); //20 bytes length is 160 bits
}

如果您需要散列的字符串表示(而不是字节数组)-您可以使用这个答案http://stackoverflow.com/a/624379/714733中的超快转换类

票数 12
EN

Stack Overflow用户

发布于 2016-09-20 22:03:03

我花了forever (几天时间)到find what to actually code才让哈希密码生效!!所以我把它放在这里是为了方便。

您确实需要阅读documentationtheory1 theory2,然后您可能会遇到一些安全漏洞。安全是一个非常重要的话题!买家要当心了!

将NuGet包BCrypt.Net添加到解决方案中

代码语言:javascript
代码运行次数:0
运行
复制
const int WorkFactor = 14;
var HashedPassword = BCrypt.Net.BCrypt.HashPassword(Password, WorkFactor); 

您应该将WorkFactor调整为适当的值,请参见discussions。它是一个log2 function

该数字为log2,因此每次计算机速度翻倍时,默认数字加1。

然后,将散列密码作为passwordFromLocalDB存储在数据库中,并测试传入的password,如下所示:

代码语言:javascript
代码运行次数:0
运行
复制
if (BCrypt.Net.BCrypt.Verify(password, passwordFromLocalDB) == true)

祝好运!

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11412882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档