8

我正在创建一个 C# 应用程序,它将在 Kiosk 风格的环境中锁定功能(组合键、Windows 任务栏等)。其中一项要求是,某些人应该仍然能够使用组合键和密码破解应用程序。

应用程序本身已完全完成,但我还没有找到存储和检查密码的好方法。一切都应该存储在本地(不检查网络数据库或其他)。如何定义用于解锁我的应用程序的密码,同时使其灵活(无需重新编译应用程序即可更改密码)。我怎样才能以安全的方式做到这一点?

4

6 回答 6

8

存储密码的安全哈希,它不需要是可逆的。

当有人输入密码时,您使用相同的算法对其进行哈希处理并检查它是否与哈希匹配。

因为您从不存储实际密码,所以它是安全的。

我建议使用像 PBKDF2 这样的密钥拉伸算法。.Net 支持这种使用Rfc2898DeriveBytes,或者您可以使用System.Web.Helpers.Crypto.

于 2013-06-06T08:49:01.320 回答
5

在配置文件中存储密码的标准方法是使用强哈希算法。阅读如何在 Winforms 应用程序中存储密码?或许还有https://en.wikipedia.org/wiki/Cryptographic_hash_function上的 wiki 文章

于 2013-06-06T08:48:12.663 回答
3

我不同意布赖恩,因为到目前为止,在任何数据库中存储密码的标准方法是“加盐”(有关详细说明,请参阅维基百科)随机生成的密码,并将散列值和加盐存储在您的“数据库”(见备注)。盐不是秘密,因此您可以将其存储为纯文本。每当用户输入您从文件中读取盐的密码时,将其应用于输入的密码,然后应用您选择的哈希算法。然后将结果与存储的哈希值进行比较。如果它们匹配,则对用户进行身份验证。对于一个好的(和有趣的:))解释为什么“只是”散列密码是不够的,请参阅:如何不存储密码!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


评论:

  • 这假设您的用户名是唯一的,因为它们被用作“数据库”中的标识键。
  • “数据库”不必是任何类型的“真实”数据库,它也可以是您的配置文件或纯文本文件。
于 2015-01-05T13:00:50.237 回答
2

您可以将密钥和密码的哈希值存储在某处,例如某个本地文件中。当人员输入密钥和密码时,您会获得此值的哈希值并将其与文件中的哈希值进行比较。

于 2013-06-06T08:48:36.257 回答
1

您需要密码的哈希值并使用哈希文本进行验证。添加盐可以使您的密码更安全。在 .Net 中,您可以使用System.Security.Cryptography.RNGCryptoServiceProvider

是一篇关于如何存储密码的好文章,我在我的 Web 应用程序中使用了它。

于 2013-06-06T08:56:47.917 回答
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

于 2013-06-06T08:48:05.160 回答