2017-08-16 5 views
1

私のシステムでは、各ユーザーが複数の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 

もっと良い方法がありますか?

+0

bcryptのは、パスワードの優れたソリューションです:パスワードが低エントロピーを持っている傾向があるため、bcryptのは、ハッシュ計算が遅いことによって、ブルートフォース攻撃を遅くします。しかし、APIキーは高いエントロピーを持つことができるため、ブルートフォース攻撃はそれほど危険ではありません。結論:SHA256のようなはるかに高速な機能が、あなたの設計にもっと適しているかもしれません。 – TheGreatContini

+0

@TheGreatContini、ok、それは答えの一部です。 – Jily

+0

@ TheGreatContiniのコメントをフォローしても、APIキーを生成している限り、ハッシングは必要ありません。長くてランダムです。 https://security.stackexchange.com/questions/18572/is-it-okay-for-api-secret-to-be-stored-in-plain-text-or-decryptableも参照してください。 – Dogbert

答えて

1

(1)むしろ、それらの普通、元の値よりも、APIキーのハッシュを格納することが賢明ですか?

あなたの目標は、誰かがあなたのデータベースへのアクセスを取得した場合に起こるかもしれない壮大な妥協(例えば、SQLインジェクション、コマンド・インジェクション、またはお使いのシステム上のシェルを逆に経由)から保護するためのようです。この場合、はい、特にユーザーごとに異なるAPIキーがある場合は合理的です。しかし、this linkはあなたの決定に影響を与えるかもしれない他の考慮事項のために読む価値があります。

(2)apiキーが有効かどうかを確認するにはどうすればよいですか?

入力をハッシュし、データベース内の何かに一致するかどうかを確認する必要があることは明らかです。

(3)実装。

パスワードに使用するのと同じ保護を適用する必要はありません。パスワードは性質上エントロピーが低い傾向がありますので、処理するにはbcryptのようなツールが必要です。 Bcryptは、(ブルートフォース攻撃を防ぐために)設計が遅く、不適切に選択されたパスワードのセキュリティを助けるために塩を使用します。

APIキーは、低エントロピーを持つべきではないので、あなたはそれらを処理するために、低速の機能を必要としません。実際、遅い関数はDoSのリスクをもたらすので、入ってくるすべての要求をbcryptしたくないのは間違いありません。塩害はまた、あなたのユースケースを複雑にします(塩は入力を提供する人が分かっているときに機能しますが、それが誰から来ているかを事前に知る)。

短い答え:SHA256を使用してください。塩は必要ありません。

関連する問題