私のシステムでは、各ユーザーが複数の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、ok、それは答えの一部です。 – Jily
@ TheGreatContiniのコメントをフォローしても、APIキーを生成している限り、ハッシングは必要ありません。長くてランダムです。 https://security.stackexchange.com/questions/18572/is-it-okay-for-api-secret-to-be-stored-in-plain-text-or-decryptableも参照してください。 – Dogbert