0

在我的程序中,我有一个简单的登录提示,以便只有某些用户可以进入程序,并根据用户使程序功能不同。我想做的是在不通过在线数据库的情况下安全地存储用户登录信息(用户名、密码等)的信息。我知道使用文本文件来存储这些信息是一个非常糟糕的主意,而且我确信有一种更简单的方法来做到这一点,而不是在我的程序内部创建一个登录信息数组。大家能给我一些建议吗?

4

2 回答 2

3

哈希是您所需要的。将哈希函数粘贴到您的代码中,MD5所有主要平台都可以在线使用函数。然后将您的散列对存储在您的配置文件中。设计一种巧妙的方法,将密码与您的准入选项组合到另一个哈希中,以便文件是防编辑的。通过这种方式,您可以分发帐户配置,并且如果您没有犯一个微不足道的密码错误,它将按照您的意愿工作。配置文件行示例(为清楚起见,哈希被截断为 6 个字符):

1a2b3c print;search;evaluate 4d5e6f

此处,1a2b3c 为MD5(username.Text+verysecret),动词为帐户权限,4d5e6f 为MD5(line[1]+verysecret+password.Text)其中 line[1] 为存储动词的配置行的拆分结果,其余为用户密码。

请注意密码是如何被动词自动加盐的,以及如何保护动词不被编辑,因为这会使密码哈希无效。verysecret 常量是隐藏在可执行代码中的东西,它会阻止任何人计算哈希值并解锁程序。

散列不是非对称密码或密钥对;一个有动机的攻击者无论如何都可以破解您的程序以完全绕过保护,因此进一步研究是没有用的。

如果您很便宜地找到了一个非对称方案,但又足够狡猾,您可以更改该 MD5 函数中的一些初始化常量。这将使您的代码更难破解,尤其是在制作假冒帐户文件时。

编辑:身份验证时,不要只是if(hashfromconfig == computedhash)...脚本小子知道如何挂钩字符串比较功能。改为写if(MD5(hashfromconfig) == MD5(computedhash))......然后字符串比较将像以前一样工作,只是它不会看到您进入想要伪造文件的宝贵密钥哈希。理想情况下,将多个版本的 MD5 函数分散在您的代码中并以不同的方式命名。使用if(foo(hashfromconfig) == bar(computedhash))...效果很好。

于 2013-04-03T17:11:33.773 回答
0

“无需通过在线数据库。” - 你的意思是在客户端?

在这种情况下,“安全存储”和“客户端”几乎是相互排斥的术语。

如果不接触某种在线(服务器端)源,绝对没有办法安全地存储数据。如果您正在接触服务器端源,它也可能是一个数据库。

于 2013-04-03T16:50:58.797 回答