PHP 的基于令牌的身份验证

Token based authentication for PHP

我正在尝试使用私钥和 public 为 API 实施身份验证。

我想做的是提供一个私钥,用它散列一些数据,然后在 header 中发送散列,然后在服务器上再次散列相同的数据以进行比较。

我遇到的问题是,我应该散列什么样的数据、请求 URI、内容类型,也许还有内容本身,但是当请求是 GET 并且没有内容时怎么办。

使用私钥散列任何数据是否足够安全,还是我需要做一些特殊的事情?

  1. 如评论中所述,此处不需要 public/private 密钥对。你想要的是身份证明。客户会给你他们的 username/id(他们会声明身份),你需要额外的证据来证明确实是他们。为此,他们发送了一个只有他们应该知道的 secret。这是一个简单的标记。

  2. 您想避免通过网络来回发送此令牌。请记住,这是一个秘密,应该尽可能保密。相反,您要求客户发送的是间接证明;你让他们签署请求。

  3. 签署请求意味着他们只是 hash the contents of the request with a MAC algorithm,他们的秘密令牌是散列的关键。

    • 您决定对请求的哪些部分进行哈希处理;散列中包含的所有内容都无法被第三方欺骗,但您应该避免要求对 所有内容 进行散列,因为 HTTP headers 可能会在请求的各个阶段添加或删除.
    • 为避免重放攻击,散列请求的日期(并要求将日期与请求一起发送)。不要接受超过特定到期日期的请求。或者,如果可行的话,包括一个不断变化的令牌。
    • 确保散列易于重现,例如需要对要散列的数据进行排序。
    • 您应该在散列中包含 URL;如果这样做,是否有 body 数据并不重要。上面的 URL + date/token 已经完全足够形成 MAC.