Delphi - 认证机制建议

RBA*_*RBA 3 delphi authentication

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

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

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

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

Arn*_*hez 5

不要重新发明轮子!

一些规则:

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

为简单起见,服务器为客户端创建"挑战".

典型的实现可以是:

  1. 客户端连接到服务器,说出其用户名;
  2. 服务器检查名称,然后为客户端创建并发送质询;
  3. 客户要求用户输入密码,然后用它来回应挑战;
  4. 服务器收到答案,然后检查挑战是否正确.

您可以使用良好的散列算法创建挑战(请查看我们非常快速的SHA-256函数),并按照以下步骤操作:

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