我正在创建一个 C# 应用程序,它将在 Kiosk 风格的环境中锁定功能(组合键、Windows 任务栏等)。其中一项要求是,某些人应该仍然能够使用组合键和密码破解应用程序。
应用程序本身已完全完成,但我还没有找到存储和检查密码的好方法。一切都应该存储在本地(不检查网络数据库或其他)。如何定义用于解锁我的应用程序的密码,同时使其灵活(无需重新编译应用程序即可更改密码)。我怎样才能以安全的方式做到这一点?
存储密码的安全哈希,它不需要是可逆的。
当有人输入密码时,您使用相同的算法对其进行哈希处理并检查它是否与哈希匹配。
因为您从不存储实际密码,所以它是安全的。
我建议使用像 PBKDF2 这样的密钥拉伸算法。.Net 支持这种使用Rfc2898DeriveBytes
,或者您可以使用System.Web.Helpers.Crypto
.
在配置文件中存储密码的标准方法是使用强哈希算法。阅读如何在 Winforms 应用程序中存储密码?或许还有https://en.wikipedia.org/wiki/Cryptographic_hash_function上的 wiki 文章
我不同意布赖恩,因为到目前为止,在任何数据库中存储密码的标准方法是“加盐”(有关详细说明,请参阅维基百科)随机生成的密码,并将散列值和加盐存储在您的“数据库”(见备注)。盐不是秘密,因此您可以将其存储为纯文本。每当用户输入您从文件中读取盐的密码时,将其应用于输入的密码,然后应用您选择的哈希算法。然后将结果与存储的哈希值进行比较。如果它们匹配,则对用户进行身份验证。对于一个好的(和有趣的:))解释为什么“只是”散列密码是不够的,请参阅:如何不存储密码!C# 加盐和散列密码
您还可以在此处找到执行此操作的好方法:https ://stackoverflow.com/a/12657970
为了快速参考,伪代码中的过程:
第一个密码存储:
//get user input
username = GetUserName
password = GetPassword
//generate random salt
salt = GetRandomValue
//combine password and salt and apply hash
hashedPassword = Hash(password + salt)
//store hash value and salt in database
AddToDatabase(username, hashedPassword, salt)
用户登录:
//get user input
username = GetUserName
password = GetPassword
//read salt from database
salt = GetSaltFromDatabase(username)
//combine password and salt and apply hash
hashedPassword = Hash(password + salt)
//compare hash to stored hash value
correctHash = GetHashFromDatabase(username)
if (hashedPassword == correctHash) then
passwordIsCorrect = True
else
passwordIsCorrect = False
end if
评论:
您可以将密钥和密码的哈希值存储在某处,例如某个本地文件中。当人员输入密钥和密码时,您会获得此值的哈希值并将其与文件中的哈希值进行比较。
您需要密码的哈希值并使用哈希文本进行验证。添加盐可以使您的密码更安全。在 .Net 中,您可以使用System.Security.Cryptography.RNGCryptoServiceProvider。
这是一篇关于如何存储密码的好文章,我在我的 Web 应用程序中使用了它。
相对容易使用ProtectSection()
和类中的UnprotectSection()
方法SectionInformation
。见这篇文章:
http://www.davidgiard.com/2012/06/05/EncryptingAndDecryptingApplicationConfigSections.aspx
http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx