PHP 的基于令牌的身份验证
Token based authentication for PHP
我正在尝试使用私钥和 public 为 API 实施身份验证。
我想做的是提供一个私钥,用它散列一些数据,然后在 header 中发送散列,然后在服务器上再次散列相同的数据以进行比较。
我遇到的问题是,我应该散列什么样的数据、请求 URI、内容类型,也许还有内容本身,但是当请求是 GET 并且没有内容时怎么办。
使用私钥散列任何数据是否足够安全,还是我需要做一些特殊的事情?
如评论中所述,此处不需要 public/private 密钥对。你想要的是身份证明。客户会给你他们的 username/id(他们会声明身份),你需要额外的证据来证明确实是他们。为此,他们发送了一个只有他们应该知道的 secret。这是一个简单的标记。
您想避免通过网络来回发送此令牌。请记住,这是一个秘密,应该尽可能保密。相反,您要求客户发送的是间接证明;你让他们签署请求。
签署请求意味着他们只是 hash the contents of the request with a MAC algorithm,他们的秘密令牌是散列的关键。
- 您决定对请求的哪些部分进行哈希处理;散列中包含的所有内容都无法被第三方欺骗,但您应该避免要求对 所有内容 进行散列,因为 HTTP headers 可能会在请求的各个阶段添加或删除.
- 为避免重放攻击,散列请求的日期(并要求将日期与请求一起发送)。不要接受超过特定到期日期的请求。或者,如果可行的话,包括一个不断变化的令牌。
- 确保散列易于重现,例如需要对要散列的数据进行排序。
- 您应该在散列中包含 URL;如果这样做,是否有 body 数据并不重要。上面的 URL + date/token 已经完全足够形成 MAC.
我正在尝试使用私钥和 public 为 API 实施身份验证。
我想做的是提供一个私钥,用它散列一些数据,然后在 header 中发送散列,然后在服务器上再次散列相同的数据以进行比较。
我遇到的问题是,我应该散列什么样的数据、请求 URI、内容类型,也许还有内容本身,但是当请求是 GET 并且没有内容时怎么办。
使用私钥散列任何数据是否足够安全,还是我需要做一些特殊的事情?
如评论中所述,此处不需要 public/private 密钥对。你想要的是身份证明。客户会给你他们的 username/id(他们会声明身份),你需要额外的证据来证明确实是他们。为此,他们发送了一个只有他们应该知道的 secret。这是一个简单的标记。
您想避免通过网络来回发送此令牌。请记住,这是一个秘密,应该尽可能保密。相反,您要求客户发送的是间接证明;你让他们签署请求。
签署请求意味着他们只是 hash the contents of the request with a MAC algorithm,他们的秘密令牌是散列的关键。
- 您决定对请求的哪些部分进行哈希处理;散列中包含的所有内容都无法被第三方欺骗,但您应该避免要求对 所有内容 进行散列,因为 HTTP headers 可能会在请求的各个阶段添加或删除.
- 为避免重放攻击,散列请求的日期(并要求将日期与请求一起发送)。不要接受超过特定到期日期的请求。或者,如果可行的话,包括一个不断变化的令牌。
- 确保散列易于重现,例如需要对要散列的数据进行排序。
- 您应该在散列中包含 URL;如果这样做,是否有 body 数据并不重要。上面的 URL + date/token 已经完全足够形成 MAC.