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# 存储数字的安全方式?的主要内容,如果未能解决你的问题,请参考以下文章