在我的系統中,每個用戶可以有多個api密鑰。我想散列api鍵並將它們的散列存儲在數據庫中。我爲此使用了愛荷星。Phoenix/Elixir中api密鑰的散列以及對此使用comeonin
1)是否明智地存儲api密鑰的哈希值,而不是其原始的原始值?
2)當一個api請求進來時,它只有一個普通的api鍵值,沒有用戶的電子郵件 - 這是我設計的系統。
我該如何檢查api密鑰是否有效?我將不得不這樣做 - 重新計算哈希值?
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
或者還有更好的方法嗎?
bcrypt是一個很好的密碼解決方案:因爲密碼的熵值較低,所以bcrypt通過減少哈希計算速度來減緩蠻力攻擊。但API密鑰可能具有較高的熵,因此強力攻擊不是這種風險。總結:比如SHA256更快的功能可能更適合您的設計。 – TheGreatContini
@TheGreatContini,好的,這是答案的一部分。 – Jily
繼續@ TheGreatContini的評論,只要你生成API密鑰,並且它們很長且隨機,我就不會看到任何散列需要。另見https://security.stackexchange.com/questions/18572/is-it-okay-for-api-secret-to-be-stored-in-plain-text-or-decrypt-able。 – Dogbert