我问 这里 关于我被要求实施的协议及其安全性。因为从一开始就很明显它是狗屎。既然如此我问:

你们能给我指出一些非常简单的登录协议吗(我在密码系统中是空的)?我正在开发应用程序的服务器端和客户端,并且我有自己的消息系统,所以我有足够的自由。

仅提供 2 个特殊特征供您建议。

  1. 简单的:该应用程序将运行的网络并不是特别不安全,我只想避免以纯文本形式发送密码

  2. 如果可能的话,消息交换不要太长。越短越好。

有帮助吗?

解决方案

查看 挑战响应认证

  • 服务器在登录表单中包含一个随机质询字符串
  • 当您登录时,JavaScript 会对密码进行哈希处理,然后使用质询对其进行哈希处理
  • 然后服务器执行相同的检查(您的数据库应该存储散列密码,但这种方法会阻止您有效地使用该散列的盐,因为您必须广播它)

其他提示

三通协议 会很方便。基本上,它可以归结为:

  • A 对其密码进行加密,并将其发送给 B。
  • B 加密密码,并将其发送回 A。
  • A 对其进行解密,并将其发回。
  • B 对其进行解密,并获得明文密码。

这样,密码就不会以明文形式发送,加密密钥也不会以明文形式发送。它也是一个相对较快的协议,因为它(大概)依赖于对称加密,速度非常快。

在数据库内容进入未经授权的人手中时,将密码哈希存储在数据库中并不是最佳安全措施。 没有办法直接反转哈希,但有在线 dictinonaries (如这里)用于反转散列(通过)单词。

在数据库中你应该存储类似的东西:

md5(login_name +  domain_or_appname_salt + password);

中间的盐可以防止多种形式的字典攻击。

在客户端(在浏览器中),您将拥有一个包含用户名和密码的登录表单。一小段javascript会对userame + app_salt_和密码进行哈希处理,因此只有login_name和生成的哈希被发送到服务器。

现在,明文密码永远不会以纯文本形式发送到服务器。 所以你不必在这里依赖HTTPS。

可以在密码更新表单中使用相同的技术。因此,服务器永远不会知道明文密码。

我希望你从这个和其他答案中得到一些启发。

快乐黑客!

Huibert

如果您的协议在TCP上运行,您只需以明文形式编写身份验证,然后使用SSL包装通信。例如,如果您使用端口1234作为协议,则可以关闭服务器上的该端口,并让客户端使用SSH对其进行隧道传输。这可以通过编程方式完成,这是一个非常常见的解决方案。

如果您的协议通过HTTP运行,则可以使用HTTPS以标准方式执行此操作。例如,基于HTTPS的基本身份验证足以满足您指定的需求。

另一方面,如果您不想在线路上发送密码,则需要进行质询响应身份验证。

  1. 服务器发送随机字符串
  2. 客户端发送随机字符串+密码
  3. 的哈希值
  4. 服务器验证哈希值。
  5. 这有一个缺点,即密码将在服务器上可用(以纯文本加密)。如果您不想在服务器上存储密码,那么您需要回到我的第一个示例。

SASL 是一种安全的身份验证机制。版本1.5 +的Java标准库中提供了对SASL的支持。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top