C# - 安全地本地存储密码

9
我正在创建一个C#应用程序,它将在Kiosk环境中锁定功能(键组合、Windows任务栏等)。其中一个要求是有些人仍然应该能够使用键组合和密码打破应用程序的锁定状态。
应用程序本身已经完成,但我没有找到一个好的方法来存储和检查密码。所有东西都应该本地存储(没有检查网络数据库或其他任何内容)。如何定义一个解锁我的应用程序的密码,同时使其灵活(能够在不重新编译应用程序的情况下更改密码)?如何以安全的方式实现这一点?

1
不要自己动手,为什么不设置本地管理员帐户呢?反正你的应用程序也不会阻止 Ctrl+Alt+Del。 - H H
不会的。但是要求是必须能够完全访问当前会话。不幸的是,我无法更改这一点。 - romatthe
6个回答

8

存储密码的安全散列值,无需可逆。

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

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

我建议使用类似于 PBKDF2 的密钥拉伸算法。.NET 可以使用 Rfc2898DeriveBytes 支持此功能,或者您可以使用System.Web.Helpers.Crypto

此外,您使用的密码应该足够长(至少12个字符,但更长更好),并带有额外的字符串盐,以防止攻击者使用彩虹表攻击。


5

请注意,在哈希密码之前,您应始终对其进行加盐以避免彩虹表攻击 - Marcus Mangelsdorf

4

我不同意Brian的观点,因为目前在任何数据库中存储密码的标准方法是使用随机生成的值对密码进行“加盐”(详见Wikipedia),并将散列值和盐存储在您的“数据库”中(参见备注)。盐不是一个秘密,所以可以明文存储。每当用户输入密码时,您从文件中读取盐,将其应用于输入的密码,然后应用您选择的哈希算法。接下来,将结果与存储的哈希值进行比较。如果它们匹配,则用户已通过身份验证。想要了解为什么“仅仅”哈希密码是不够安全的,请参阅这篇有趣的文章:How NOT to store passwords! 想要在C#中实现加盐和哈希过程的教程,请参考:C# Salting & Hashing Passwords

您还可以在这里找到一种不错的方法:https://dev59.com/_mcs5IYBdhLWcg3wrl4Z#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


备注:

  • 假设您的用户名是唯一的,因为它们用作“数据库”中的标识键。
  • “数据库”不必是任何类型的“真实”数据库,它也可以是您的配置文件或纯文本文件。

2

您可以将密钥和密码的哈希值存储在某个本地文件中。当用户输入密钥和密码时,您会获取这些值的哈希值并将其与文件中的哈希值进行比较。


1

0

3
好的链接,但回答不能只是链接而没有其他内容。 - Keith
2
这里有一篇完整的文章,比我在这里能够给出的任何简短解释都要好得多;-) - Oscar
9
也许是这样,但链接会随着时间而失效。尽管可以链接到更长的文章,但答案应该是完整的,即使该链接发生变化。 - Keith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接