C# 存储数字的安全方式?

Posted

技术标签:

【中文标题】C# 存储数字的安全方式?【英文标题】:C# Secure way to store a Number? 【发布时间】:2017-05-18 21:14:08 【问题描述】:

我已经为 Windows 7 构建了自己的锁定屏幕。因此,它使用密码来解锁自己。所以我决定只存储密码字符串的哈希码(例如,我调用字符串“Password123”的GetHashCode方法)。现在我有存储号码的任务。我将如何以最安全的方式做到这一点?还是使用密码字符串的哈希码甚至是最好的方法?我的目标是阻止某人访问此号码,并最终阻止某人发现密码。

以下是我目前想出的一些可能的方法:

    将密码的哈希码存储在主程序旁边的未加密纯文本文件中。 将密码的哈希码存储在主程序旁边的加密文本文件中(这引入了存储和获取合适的密钥进行加密的问题) 将密码的哈希码存储在一个小型已编译 C# 库中。 执行上述操作,但加密生成的程序集。然后,要加载它,只需将所有字节读入内存,解密,然后使用 Assembly.Load 加载原始字节数组。

现在有没有更好(更安全)的方法来阻止别人发现我试图存储在硬盘上的哈希码?

编辑:根据下面的 cmets,我正在为程序开发一个补丁,以使用散列算法来获取我的密码的散列码。现在的问题是“我如何在硬盘驱动器上安全地存储字节数组?以上所有选项仍然适用。

提前感谢您的帮助。

【问题讨论】:

您知道String.GetHashCode() 的密码强度不高,到处都会发生冲突,对吧?更不用说散列算法可以而且确实会在平台和.NET 框架的版本 之间发生变化?不要那样做。这是个坏主意。 @wkl 谢谢,我以为我在写它的时候就这么做了。哎呀。 ***.com/questions/442443/… 补充 Frédéric 所说的,对于一般情况,对 .GetHasCode() 的调用不需要在同一程序的多次运行(或在单个程序中)为同一对象返回相同的值跨多个 AppDomain 运行)。它只保证在程序的单次运行中为同一个对象返回相同的值。 我支持 Plutonix 使用 Rfc2898DeriveBytes。 SHA 系列算法非常快,当涉及到密码散列时,您根本不希望它很快。老实说,由于您使用的是 C#,我将使用 PBKDF2 而不是 BCrypt,因为 C# 已经有官方实现,而 BCrypt 是您需要添加的外部库。在这里您可以阅读有关 PBDKDF2 和 Rfc2898DeriveBytes 的更多信息:owasp.org/index.php/Using_Rfc2898DeriveBytes_for_PBKDF2 【参考方案1】:

如果我正确理解您的要求,您希望保护您的桌面。是否有人可以读取哈希并不重要,只要他们必须做很多工作来找出它来自的密码。所以你想要的是一个像后来的 SHA 一样的像样的加密散列算法。请参阅 [https://en.wikipedia.org/wiki/One-way_function][1] 并注意,即使您知道算法和所有存储的哈希值,也不应该能够按照相反的过程恢复原始密码。

当然,所有关于强密码的常规准则仍然适用 - 最小长度、字母数字和非字母数字的混合等。

您也不希望有人随意删除或修改您的哈希值,因为这会将包括您在内的所有人拒之门外,因此我会避免使用常规文件系统并建议在 CURRENT_USER 下使用注册表。

【讨论】:

以上是关于C# 存储数字的安全方式?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 c# 以编程方式将证书安装到本地机器存储中?

在 .NET C# 中存储加密密钥的最佳方式

C# 程序中的变量

在数据库字段中存储数字数组

C#创建安全的字典(Dictionary)存储结构

在 C# 中存储使用 MD5CryptoServiceProvider 散列的密码是不是安全?