【问题标题】:Send credentials surely to an API确保将凭据发送到 API
【发布时间】:2021-07-30 07:16:33
【问题描述】:

假设我有一个服务器 server 和一个 API API,我想从 serverAPI 发送一个 POST 操作,我需要包含一些凭据以允许 POST 请求(请注意,API 仅接受 https-repsonses)。在这里,API 是 Google Compute Engine,server 是 Google App Engine - 如果这有什么不同的话。

我的第一个想法是使用一些通用密钥和 SHA256,例如 key = SHA(today_date+salt_key) 并将 key 与请求一起发送到 API。然后在服务器上计算check_key = SHA(today_date+salt_key) 并查看key==check_key 是否无法解决任何问题,因为凭据现在只是散列凭据,即如果有人获得散列凭据(key),他们可以只需将它们与恶意 POST 请求一起直接发送即可。

那么,我该如何克服这个问题呢?我是否在 server 上加密 API 密钥并在 API 上解密它(是否有任何“最佳实践”加密方案?或者有更简单的方法吗?

【问题讨论】:

    标签: security api-key


    【解决方案1】:

    我们通常在 API 设计中对用户进行身份验证的做法通常是以下其中一种:

    1. 以纯文本形式传递来自用户的凭据,在服务器上对用户进行身份验证,将会话 cookie 或某些令牌(例如 JWT)返回给他,
    2. 传递一些 API 令牌并基于此验证每个请求,
    3. 使用 HTTP 基本身份验证并在每个请求中传递凭据(或凭据摘要)。

    还有其他身份验证机制(如零知识、知识证明身份验证方案),但它们不像上面的那样流行。

    是什么阻止您使用上面列表中的第 1 点?您是否尝试使用凭据摘要来重新发明第 3 点?

    【讨论】:

    • 我担心的是避免 API 密钥被中间人捕获。如果我使用 API 密钥作为有效负载发送请求,那么捕获该请求的任何人现在都具有 POST 权限,因此我试图使其“中间人”安全。
    • 我只是想 - 服务器和 API 不能以相同的方式应用 salt-key,这样 API 密钥就是例如 {"key":abce, "salted" :h8fyao10} 因此 API 可以以特定方式加盐“abce”,并查看它是否获得“加盐”密钥?
    • 比如salted_key = salt_func("abce")key = sha256(salted_key),然后将{"org_string":"abce", "encrypted":key}发送到API,API然后评估sha256(salt_func(org_string)) == encrypted(有点像公钥/私钥共享)
    猜你喜欢
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 1970-01-01
    • 2017-01-19
    • 1970-01-01
    相关资源
    最近更新 更多