Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-安全地在本地存储密码_C#_.net_Security_Passwords_Kiosk - Fatal编程技术网

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

C#-安全地在本地存储密码,c#,.net,security,passwords,kiosk,C#,.net,Security,Passwords,Kiosk,我正在创建一个C#应用程序,它将在Kiosk风格的环境中锁定功能(组合键、windows任务栏等)。其中一个要求是,有些人应该仍然能够使用组合键和密码破解应用程序 应用程序本身已经完全完成了,但我还没有找到一种存储和检查密码的好方法。所有内容都应该存储在本地(没有对网络数据库或其他任何内容进行检查)。我如何定义一个密码来解锁我的应用程序,同时使其灵活(无需重新编译应用程序即可更改密码)。如何以安全的方式完成此任务?使用SectionInformation类中的ProtectSection()和U

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


应用程序本身已经完全完成了,但我还没有找到一种存储和检查密码的好方法。所有内容都应该存储在本地(没有对网络数据库或其他任何内容进行检查)。我如何定义一个密码来解锁我的应用程序,同时使其灵活(无需重新编译应用程序即可更改密码)。如何以安全的方式完成此任务?

使用
SectionInformation
类中的
ProtectSection()和
UnprotectSection()方法相对容易。见本文:


在配置文件中存储密码的标准方法是使用强哈希算法。阅读上的答案,或者阅读上的wiki文章,您可以将密钥和密码的散列存储在某个地方,例如在某个本地文件中。当用户输入密钥和密码时,您会得到该值的哈希值,并将其与文件中的哈希值进行比较。

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

当有人输入密码时,您可以使用相同的算法对其进行散列,并检查其是否与散列匹配

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


我建议使用像PBKDF2这样的密钥拉伸算法。Net使用Rfc2898DeriveBytes对此提供支持,或者您可以使用。

您需要密码的散列并使用散列文本进行验证。添加salt可以使您的密码更安全。在.Net中,您可以使用


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

我不同意Brian的观点,因为到目前为止,在任何数据库中存储密码的标准方法是“salt”(有关详细说明,请参阅)使用随机生成的值创建密码,并将哈希值和salt存储在“数据库”中(参见备注)。盐不是秘密,所以你可以把它储存在纯文本中。每当用户输入密码时,您从文件中读取salt,将其应用于输入的密码,然后应用您选择的哈希算法。然后将结果与存储的哈希进行比较。如果匹配,则对用户进行身份验证。要了解“仅仅”散列密码是不够的原因,请参阅: 有关C语言中盐析和散列过程的教程实现,请参见:

您也可以在这里找到一种很好的方法:


请快速参考伪代码中的流程:

第一个密码存储:

//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

用户登录:

//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

备注:

//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
  • 这假设您的用户名是唯一的,因为它们被用作“数据库”中的标识键
  • “数据库”不必是任何类型的“真实”数据库,它也可以是您的配置文件或纯文本文件

与其自己动手,不如建立一个本地管理员帐户?你的应用程序不会阻止Ctrl+Alt+Del。不,不会。但要求是,一个人应该能够完全访问当前会话。不幸的是,我无法改变这一点。很好的链接,但答案不应该仅仅是链接而已。这里有一篇完整的文章,比我在这里给出的简短解释要好得多;-)也许吧,但随着时间的推移,链接会消失。一定要链接到一篇较长的文章,但是如果链接发生变化,答案应该是完整的。注意,在散列之前,您应该始终使用您的密码以避免!