Delphi认证机制建议

Delphi认证机制建议,delphi,authentication,Delphi,Authentication,这个问题只有教育目的。目前,我正在制作一个小应用程序,希望在其中包含一个身份验证机制。应用程序在安装时应该可以访问Internet,但安装后可以脱机工作。到目前为止,我一直在考虑以下解决方案: 1) 经典:用户名和密码(加密)发送到身份验证Web服务-Internet连接关闭时出现问题。 2) 根据主板/硬盘序列号生成密码-组件更改时会产生问题 另外,我想包括一个“记住密码”复选框。哪种方法最安全?我应该在哪里存储此信息 我相信你们中的大多数人已经建立了一个或多或少复杂的身份验证机制,我正在征求

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

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

另外,我想包括一个“记住密码”复选框。哪种方法最安全?我应该在哪里存储此信息


我相信你们中的大多数人已经建立了一个或多或少复杂的身份验证机制,我正在征求你们的意见。此外,我知道任何东西都可以被黑客攻击,但我想让它变得尽可能困难。

取决于你想要实现什么。例如,您可能首先从服务器检索一些关键数据,然后始终将其存储在本地,并使用登录密码进行加密。这样,电脑上就不会存储密码,您必须输入密码才能访问数据。

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

为了记住密码,您可以将其哈希保存在本地,而不能将其解散以获得真正的pwd…

不要重新发明轮子

一些规则:

  • 认证必须是每个用户
  • 认证必须针对会话,即针对网络连接和某个给定时间
  • 从不在磁盘上清晰地存储密码,而是使用哈希
  • 切勿通过网络传输密码,而是使用哈希
  • 在散列任何值时添加一些“salt”(即随机数据)
  • 试着达到某种目的
为了简单起见,服务器为客户端创建了一个“挑战”

典型的实现可以是:

  • 客户端连接到服务器,说出其用户名
  • 服务器检查名称,然后为客户端创建并发送质询
  • 客户端要求用户输入密码,然后使用密码响应挑战
  • 服务器收到答案,然后检查质询是否正确
  • 您可以使用一个好的哈希算法创建一个质询(请看),并遵循以下步骤:

    • 用户输入其初始密码,然后向服务器发送SHA-256(通过固定私钥加密,例如)
    • 服务器将用户名/密码散列存储为密钥/值
    • 服务器通过创建随机块创建质询(使用一些随机数据的SHA-256,包括当前时间和其他随机+随机值…)
    • 客户端使用用户刚刚输入的密码散列对这个随机块(从服务器接收)进行散列
    • 服务器从客户端接收结果,使用存储的用户密码散列计算自己的版本,并比较两个值:如果两个值相同,则质询成功

    非常有趣的方法+1.但是,如果用户没有一直连接到internet?例如,用户使用该应用程序5次,并且他/她仅在这5次中的2次有连接?很好,答案显然是假设您正在对某个远程服务器或服务进行身份验证。你到底在证明什么?您是否有针对本地和远程机构的某种混合身份验证的设计和计划?您是否需要公文包模型,如在Windows上工作的NT/XP/W7域登录?对于本地身份验证,客户端软件可以将用户名/密码散列作为密钥/值的私有副本,只需比较用户输入的值的散列即可。使用SHA-256,无法找到相同文本的两个匹配项。用户名也可以存储为SHA-256,并且使用AES-256加密的整个密钥/值内容。散列可以很好地存储“密码”,但传输散列或密码没有什么区别。。。无论如何,有人可能会尝试应答攻击。或者您保护通道(正确加密和/或签名消息),或者您需要更复杂的模式(即Kerberos)。@ldsandon您错了:在我上面的建议中,密码哈希永远不会传输得那么清楚。它是在使用从服务器收到的“challenge”值(以及一些“salt”值,如果您遵循规则)进行散列后传输的。因此,如果您使用的是像SHA-256.+1这样的强散列,则不能仅通过监听网络传输返回密码散列值。这就是我想要完成的。另请看我对A.Bouchez的回复,并详细说明答案。我不确定你的问题是否以目前的形式可以回答。我认为,一旦一个服务器质询响应被接受,并且您在本地存储哈希,您就会发现这将足够好,但仅此而已。我不同意这里所说的。无论是加密还是未加密,存储密码都不是一种好的做法:最好存储密码的散列,最好添加一些盐。我没有更好的
    ,而是将密码存储到数据库中。数据库有什么特别之处?这可能更方便,但更好吗?代码< >不需要生成密码< /代码>:世界上有谁会考虑为用户生成密码?我并没有说存储密码是个好主意。我说过他能做到。如果他这样做了,最好将其存储在数据库中,因为它不是