VB - 用于离线授权的哈希注册数据

时间:2011-08-31 18:42:53

标签: vb.net hash registration

我有一个vb应用程序,我使用在线mysql数据库进行用户访问。在线数据库具有用户名,密码,然后是一堆单个数字(基本上是/否)字段,用于确定允许用户访问哪些项目。当用户登录时,数据库会检索所有“是”答案并启用这些按钮,并检索所有“否”答案并禁用这些按钮。

我的问题是任何给定用户都不会在线的可能性非常大。所以我想把在线数据库复制到本地设备(这个程序将在Windows平板电脑上运行,可能有也可能没有互联网 - 可能永远不会有互联网连接)。这可能就足够了,除非用户可能使用不同的平板电脑,并且该设备不知道允许用户访问什么(基于缺少互联网连接)。

所以我的新方法是用户注册,让他们提供名字,姓氏,电话号码和电子邮件地址。此时我还会选择他们被授权使用的按钮。我想将所有信息放入代码(可能是哈希),以便下次用户登录(在线或离线)时,他们将使用他们的名字,姓氏和生成的代码。用户甚至可以转到不同的设备并仍然获得相同的结果。我希望这是有道理的。

所以基本上我正在寻找一种方法(我很确定涉及散列),这将允许用户注册一些信息,接收将它连接在一起的代码,然后登录到运行我的任何Windows平板电脑没有设备的程序必须上网下载新的授权用户列表。

提前致谢。

1 个答案:

答案 0 :(得分:0)

哈希是部分你想到的,但不是整个事情。哈希的一个关键部分是它不可逆,因此你不能在它自己上使用哈希来传递信息,比如启用/禁用哪些按钮。听起来你还需要在系统的其他地方实现散列(永远不要存储未散列的密码!)。此问题所需的其余部分是安全检查数字。

这个想法是你生成一个带有几个孔/空格的数字,其中数字的不同部分具有不同的含义。它可能看起来像:

  

4325_-23R3_-F257_-D982 _- _ _

其中一些字符是用户信息的哈希值,其他字符的位对应于您的是/否数据库字段。一旦你拥有了这么多,你有一个算法(使用安全密钥)来计算丢失空格中的字符,然后你可以向你的用户发出最终的数字。您的软件将采用用户输入的数字,并检查确保其出现的校验位数与输入的校验位数相符。

这种方法有一个缺点。允许离线激活意味着包括用于计算产品校验位数的密钥,以及任何数字安全性,一旦你将这种东西放在野外破解者中能够找到一种方法得到它。


现在让我们继续讨论当前代码中存在的巨大漏洞。您声明您的数据库存储用户名和密码。我希望你只是简化一些事情,但这是一个巨大的问题,到目前为止,我无法在良心上保持不受质疑。您应该散列密码并仅存储散列,而不是存储实际密码。当有人想要登录时,您可以对他们尝试使用的尝试密码进行哈希并比较哈希值。这是一个大不了的事情,如果你不这样做,你就是错误的

这也过度简化了一点。您还希望在对密码进行哈希处理之前对其进行加密,以帮助阻止对常见哈希结果的字典攻击。另外,散列算法的选择很重要。 md5不会在这里削减它。你最好的选择是bcrypt或scrypt,但如果你真的需要,你现在可以使用sha1。

这里要知道的最重要的事情是你应该从不尝试构建自己的身份验证系统。很容易让它足够接近它通过你所有的测试,但仍然是一些微妙的方式错误,直到一年后,当你发现你六个月前被黑客攻击时,它将无法知道。相反,请为现有平台寻找预先编写的组件或产品来处理此问题。尽可能地依赖专门从事该领域的项目(和程序员)的代码。