【问题标题】:Improve my Shared Secret Algorithm/Methodology & suggest a Encryption Protocol改进我的共享秘密算法/方法并建议加密协议
【发布时间】:2011-10-28 13:55:22
【问题描述】:

我正在寻找允许我在我的应用和 HTML 页面之间使用共享密钥的协议/算法。

共享密钥旨在确保只有拥有该应用程序的人才能访问该网页。

我的问题:我不知道什么算法(我的方法来验证对 HTML 页面的有效访问)以及我应该为此使用什么加密协议。

人们向我建议我使用 HMAC SHAXXX 或 DES 或 AES,我不确定我应该使用哪个 - 你有什么建议吗?

我的算法是这样的:

  • 我创建了一个应用程序和 HTML 页面都知道的共享密钥(我们称之为“MySecret”)。为确保共享密钥始终唯一,我将在密钥末尾添加当前日期和分钟,然后使用 XXX 算法/协议(HMAC/AES/DES)对其进行哈希处理。因此,未加密的秘密将是“MySecret08/17/2011-11-11”,并且可以说它的哈希是“xyz”
  • 然后我将此哈希添加到 url CGI:http://mysite.com/comp.py?sharedSecret=xyz
  • comp.py 脚本然后使用相同的共享密钥和日期组合,对其进行散列,然后检查生成的散列是否与 CGI 变量 sharedSecret("xyz") 相同。如果是,那么我知道一个有效的用户正在访问该网页。

你能想出更好的方法来确保有效的人可以访问我的网页(网页允许用户参加比赛)吗?

我认为我使用 共享密钥 走在了正确的轨道上,但我验证密钥的方法似乎存在缺陷,尤其是如果哈希算法不会为相同的结果产生相同的结果时间。

【问题讨论】:

标签: c++ python encryption hash


【解决方案1】:

特别是如果哈希算法不会始终为相同的输入产生相同的结果。

然后散列被破坏。为什么不呢?

在简单的情况下您需要 HMAC。您正在使用共享密钥“签名”您的请求,并且签名由服务器验证。请注意,HMAC 应包含更多数据以防止重放攻击 - 事实上,它应包含所有查询参数(按指定顺序)以及序列号以防止窃听者重放同一消息。如果您正在验证的只是共享密钥,那么任何无意中听到消息的人都可以继续使用此共享密钥,直到它过期。通过包含序列号或较短的有效范围,您可以将服务器配置为对其进行标记。

请注意,这仍然不完美。 TLS 支持客户端和服务器端证书支持 - 为什么不使用它?

【讨论】:

  • +1 用于包含整个 URL。这会让您非常接近 OAuth。
  • 感谢您的回复:我不确定如何使用序列号,但是?应用程序和 python 脚本都需要知道序列号,不是吗?
  • @Bouszeer11:它可以作为请求的一部分安全地发送。只要序列号是被 HMAC 化的数据的一部分,就可以进行身份​​验证。
  • 时间戳也可以作为请求的一部分发送。这样可以减少猜测。
【解决方案2】:

看起来它会起作用。时钟漂移可能是一个问题,您可能需要验证一个范围,例如 +/- 3 分钟,如果它在准确的时间失败。

特别是当哈希算法不能始终为相同的输入产生相同的结果时有缺陷

那么,那将是一个损坏的哈希算法。可靠哈希每次都会为相同的输入生成相同的输出(并且几乎总是为不同的输入生成不同的输出)。

【讨论】:

  • 请注意(取决于您的方案)您可能需要包含更多信息,而不仅仅是查看密钥和时间戳以避免重放攻击(请参阅@Yann 的回复)。
【解决方案3】:

尝试使用某种网络加密。您的 Web 服务器应该能够自动处理该类型的身份验证。剩下的就是让您将其写入您的应用程序(无论如何您都必须这样做)。根据您的应用平台,您也可以自动执行此操作。

Google 这些:需要 Kerberos、SPNEGO 和 HTTP 401 授权。您可能能够摆脱简单的硬编码用户名和密码 HTTP 标头,并通过 HTTPS 运行连接。这样,您的服务器上的自定义代码就会减少,并且您的服务器会负责为您验证您的请求。更不用说您正在利用 HTTP 的一些附加功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2018-01-07
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多