gpt4 book ai didi

security - Phoenix/Elixir 中 api key 的散列并为此使用 comeonin

转载 作者:行者123 更新时间:2023-12-03 06:37:25 30 4
gpt4 key购买 nike

在我的系统中,每个用户可以拥有多个 api key 。我想对 api key 进行哈希处理并将其哈希值存储在数据库中。我为此使用了comeonin。

1) 存储 api 键的哈希值而不是其简单的原始值是否明智?

2) 当 api 请求传入时,其中只有一个普通的 api 键值,并且没有用户电子邮件 - 这是我的系统设计的。

我应该如何检查 api key 是否有效?我必须这样做——重新计算哈希值吗?

given_api_plain_key = get_key_from_request()

# re-hash it again
# but how about the original salt???

given_api_hash_key = Comeonin.Bcrypt.hashpwsalt(given_api_plain_key)


case Repo.get_by(ApiKey, key_hash: given_api_hash_key) do
nil -> IO.puts("not found")
a -> IO.puts("gooood")
end

或者有更好的方法吗?

最佳答案

(1) 存储 api 键的哈希值而不是其简单的原始值是否明智?

您的目标似乎是防止有人访问您的数据库(例如,通过 SQL 注入(inject)、命令注入(inject)或系统上的反向 shell)时可能发生的重大妥协。在这种情况下,是的,这是明智的,特别是如果每​​个用户都有不同的 API key 。然而this link值得一读,了解可能影响您决定的其他考虑因素。

(2) 如何检查 api key 是否有效?

很明显,您需要对输入进行哈希处理并查看是否与数据库中的某些内容匹配。

(3)实现。

您不想应用与密码相同的保护。密码本质上往往具有低熵,因此我们需要像 bcrypt 这样的工具来处理它们。 Bcrypt 的设计速度很慢(以防止暴力攻击),并使用盐来帮助确保选择不当的密码的安全性。

API key 不应具有低熵,因此您不需要慢速函数来处理它们。事实上,缓慢的函数会带来 DoS 风险,因此您绝对不想对每个传入的请求都进行 bcrypt。加盐也会使您的用例变得复杂(当您知道谁在提供输入时,加盐会起作用,但在您的情况下,您不知道)事先知道它来自谁)。

简短回答:只需使用 SHA256,无需加盐。

关于security - Phoenix/Elixir 中 api key 的散列并为此使用 comeonin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45703781/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com