【发布时间】:2017-05-18 21:14:08
【问题描述】:
我已经为 Windows 7 构建了自己的锁定屏幕。因此,它使用密码来解锁自己。所以我决定只存储密码字符串的哈希码(例如,我调用字符串“Password123”的GetHashCode方法)。现在我有存储号码的任务。我将如何以最安全的方式做到这一点?还是使用密码字符串的哈希码甚至是最好的方法?我的目标是阻止某人访问此号码,并最终阻止某人发现密码。
以下是我目前想出的一些可能的方法:
- 将密码的哈希码存储在主程序旁边的未加密纯文本文件中。
- 将密码的哈希码存储在主程序旁边的加密文本文件中(这引入了存储和获取合适的密钥进行加密的问题)
- 将密码的哈希码存储在一个小型已编译 C# 库中。
- 执行上述操作,但加密生成的程序集。然后,要加载它,只需将所有字节读入内存,解密,然后使用 Assembly.Load 加载原始字节数组。
现在有没有更好(更安全)的方法来阻止别人发现我试图存储在硬盘上的哈希码?
编辑:根据下面的 cmets,我正在为程序开发一个补丁,以使用散列算法来获取我的密码的散列码。现在的问题是“我如何在硬盘驱动器上安全地存储字节数组?以上所有选项仍然适用。
提前感谢您的帮助。
【问题讨论】:
-
您知道String.GetHashCode() 的密码强度不高,到处都会发生冲突,对吧?更不用说散列算法可以而且确实会在平台和.NET 框架的版本 之间发生变化?不要那样做。这是个坏主意。
-
@wkl 谢谢,我以为我在写它的时候就这么做了。哎呀。
-
补充 Frédéric 所说的,对于一般情况,对
.GetHasCode()的调用不需要在同一程序的多次运行(或在单个程序中)为同一对象返回相同的值跨多个 AppDomain 运行)。它只保证在程序的单次运行中为同一个对象返回相同的值。 -
我支持 Plutonix 使用 Rfc2898DeriveBytes。 SHA 系列算法非常快,当涉及到密码散列时,您根本不希望它很快。老实说,由于您使用的是 C#,我将使用 PBKDF2 而不是 BCrypt,因为 C# 已经有官方实现,而 BCrypt 是您需要添加的外部库。在这里您可以阅读有关 PBDKDF2 和 Rfc2898DeriveBytes 的更多信息:owasp.org/index.php/Using_Rfc2898DeriveBytes_for_PBKDF2