我正在创建一个C#应用程序,它将在Kiosk风格的环境中锁定功能(组合键,窗口任务栏等)。其中一个要求是,某些人仍然可以使用密钥组合和密码打破应用程序。
应用程序本身已完全完成,但我找不到存储和检查密码的好方法。一切都应该存储在本地(没有检查网络数据库或其他)。如何定义用于解锁我的应用程序的密码,同时使其灵活(无需重新编译应用程序即可更改密码)。我怎样才能以安全的方式实现这一目标?
答案 0 :(得分:8)
存储密码的安全散列,它不需要是可逆的。
当有人输入密码时,您可以使用相同的算法对其进行哈希处理,并检查它是否与哈希匹配。
因为您从不存储实际密码,所以它是安全的。
我建议使用像PBKDF2这样的按键拉伸算法。 .Net使用Rfc2898DeriveBytes
支持此功能,或者您可以使用System.Web.Helpers.Crypto
。
答案 1 :(得分:4)
在配置文件中存储密码的标准方法是使用强哈希算法。阅读How to store passwords in Winforms application?上的答案以及https://en.wikipedia.org/wiki/Cryptographic_hash_function
上的wiki文章答案 2 :(得分:2)
您可以在某处存储密钥和密码的哈希值,例如在某些本地文件中。当人输入密钥和密码时,您会获得此值的哈希值,并将其与文件中的哈希值进行比较。
答案 3 :(得分:2)
我不得不反对Brian,因为到目前为止,在任何数据库中存储密码的标准方法是“盐”#34; (有关详细说明,请参阅Wikipedia)带有随机生成值的密码,并将散列值和盐存储在"数据库" (见备注)。盐不是秘密,所以你可以用纯文本存储它。每当用户输入密码时,您都会从文件中读取salt,将其应用于输入的密码,然后应用您选择的哈希算法。然后将结果与存储的哈希值进行比较。如果匹配,则对用户进行身份验证。为了一个好的(和有趣的:))解释为什么"只是"哈希密码不够,请参阅:How NOT to store passwords! 有关C#中salting和散列过程的教程实现,请参阅:C# Salting & Hashing Passwords
您还可以在此处找到一种好方法: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
<强>说明:强>
答案 4 :(得分:1)
您需要密码哈希并使用散列文本进行验证。添加盐可以使您的密码更安全。在.Net中,您可以使用System.Security.Cryptography.RNGCryptoServiceProvider。
Here是一篇很好的文章,讨论如何存储您的密码,并在我的网络应用程序中使用它。
答案 5 :(得分:0)
使用ProtectSection()
类中的UnprotectSection()
和SectionInformation
方法相对容易。看到这篇文章:
http://www.davidgiard.com/2012/06/05/EncryptingAndDecryptingApplicationConfigSections.aspx
http://msdn.microsoft.com/en-us/library/system.configuration.sectioninformation.protectsection.aspx