Delphi - 认证机制建议

时间:2011-01-21 14:10:10

标签: delphi authentication

这个问题只有教育目的。此时我正在制作一个小应用程序,我希望在其中包含一个身份验证机制。应用程序在安装时应该可以访问Internet,但是可以脱机工作。到目前为止,我一直在考虑以下解决方案:

1)Classic:发送到身份验证Web服务的用户名和密码(已加密) - Internet连接断开时出现问题。
2)根据主板/硬盘序列号生成密码否 - 这会在组件更改时产生问题。

另外,我想要包含一个'记住密码'复选框。这是最安全的方法吗?我应该在哪里存储这些信息?

我相信你们大多数人已经建立了一个或多或少复杂的认证机制,而且我在征求你的意见。此外,我知道一切都可以被黑,但我想尽可能地让它变得困难。

4 个答案:

答案 0 :(得分:5)

不要重新发明轮子!

一些规则:

  • 身份验证必须是每个用户;
  • 身份验证必须用于会话,即网络连接和某个给定时间;
  • 从不在磁盘上清楚地存储密码,但使用哈希值;
  • 从不通过网络传输密码,但使用哈希值;
  • 在散列任何值的过程中添加一些“盐”(即随机数据);
  • 尝试实现某种Zero-knowledge proof

为简单起见,服务器为客户创建“挑战”。

典型的实施可以是:

  1. 客户端连接到服务器,说出其用户名;
  2. 服务器检查名称,然后为客户创建并发送质询;
  3. 客户要求用户输入密码,然后用它来回应质询;
  4. 服务器收到答案,然后检查质询是否正确。
  5. 您可以使用优秀的哈希算法创建挑战(请查看our very fast SHA-256 functions),然后按以下步骤操作:

    • 用户输入其初始密码,然后将SHA-256传输到服务器(例如通过固定私钥加密);
    • 服务器存储用户名/密码哈希为键/值;
    • 服务器通过创建随机块(使用一些随机数据的SHA-256,包括当前时间和其他随机化+随机值......)来创建挑战;
    • 客户端使用刚刚输入的密码哈希值对此随机块(从服务器接收)进行哈希处理;
    • 服务器从客户端接收结果,使用存储的用户密码哈希值计算自己的版本,并比较两个值:如果两个值相同,则challenge成功。

答案 1 :(得分:3)

取决于您想要实现的目标。例如,您可能首先从服务器检索一些关键数据,然后始终将其存储在本地,通过login-password加密。这样,PC上就不会存储密码,您必须输入密码才能访问数据。

答案 2 :(得分:3)

为了记住密码,您可以在本地保存其哈希值,这不能用于获取真正的密码...

答案 3 :(得分:2)

您可以使用Cookie执行浏览器操作并将密码存储在加密文件中,或者甚至更好地将其存储到数据库中。请记住,如果用户在服务器上更改了密码,则需要更新数据库密码。 您无需生成密码。您可以要求用户这样做,并检查其复杂性以确保其安全。 并且在连接到Web服务时始终使用SSL,以确保所有数据都可以安全传输。