APIキーとシークレットキーはどのように機能しますか?APIと秘密鍵を別のアプリケーションに渡す必要がある場合、安全ですか?


136

私は、APIキーと秘密キーがどのように機能するかについて考え始めています。わずか2日前に、Amazon S3にサインアップし、S3Foxプラグインをインストールしました。アクセスキーとシークレットアクセスキーの両方を求められましたが、どちらにもアクセスするにはログインが必要です。

彼らが私の秘密鍵を求めているのなら、彼らはそれをどこかに正しく保管しているに違いないのではないかと思います。基本的に、クレジットカード番号やパスワードを尋ねて、自分のデータベースに保存するのと同じではありませんか。

秘密鍵とAPI鍵はどのように機能するはずですか?彼らはどのくらい秘密にする必要がありますか?秘密鍵を使用するこれらのアプリケーションは、何らかの方法でそれを格納していますか?

回答:


90

ここで概要を説明します

動作方法は次のとおりです。たとえば、0から9までの数値を取り、3を加算し、結果が10より大きい場合は10を減算する関数があるとします。したがって、f(2)= 5、f(8)= 1などです。ここで、3つではなく7つ追加することで、別の関数を作成し、f 'と呼びます。f '(5)= 2、f'(1)= 8など

これは、双方向関数とその逆の例です。理論的には、あるものを別のものにマッピングする数学関数は逆にすることができます。ただし実際には、入力をスクランブルする関数を作成して、元に戻すことが非常に困難になるようにすることができます。

入力を受け取り、一方向関数を適用することを入力の「ハッシュ」といい、Amazonがシステムに保存するのは秘密鍵の「ハッシュ」です。SHA1は、この種の「一方向」機能の例であり、攻撃に対しても強化されています。

HMAC機能は、テキストの文字列を認証するために知られているキーを使用するために設立されたハッシュ関数に基づいています。それはこのように動作します:

  • リクエストのテキストと秘密鍵を取得して、HMAC関数を適用します。
  • その認証ヘッダーをリクエストに追加して、Amazonに送信します。
  • Amazonは秘密鍵のコピーと送信したテキストを調べ、HMAC関数を適用します。
  • 結果が一致した場合、彼らはあなたが同じ秘密鍵を持っていることを知っています。

これとPKIの違いは、この方法はRESTfulであり、システムとAmazonのサーバーとの間の交換の数が最小限に抑えられることです。

基本的に、クレジットカード番号やパスワードを尋ねて、自分のデータベースに保存するのと同じではありませんか。

はい。ただし、S3を使用した場合の被害はアカウントの流出に限定されているようです。

彼らはどのくらい秘密にする必要がありますか?秘密鍵を使用するこれらのアプリケーションは、どういうわけかそれを格納していますか?

ある時点で、秘密鍵をロードする必要があります。ほとんどのUnixベースのシステムでは、攻撃者がrootアクセスを取得できる場合、鍵を取得できます。キーを暗号化する場合は、キーを復号化するためのコードが必要です。また、ある時点で、復号化コードは実行可能なようにプレーンテキストである必要があります。これは、コンピューターを所有していることを除いて、DRMと同じ問題です。

多くの場合、私は制限されたアクセス許可を持つファイルに秘密鍵を配置し、私のシステムがルート化されないように通常の予防策を講じます。一時ファイルを回避するなど、マルチユーザーシステムで適切に動作させるためのいくつかのトリックがあります。


14
「入力を取得して一方向関数を適用することは、入力の「ハッシュ」と呼ばれ、Amazonがシステムに保存するのは秘密鍵の「ハッシュ」です」-Amazonが秘密鍵のハッシュを保存する場合、それはどのように行われますかAmazonが送信されたテキストをハッシュ化することは可能ですか?
フランクリン

21
最初に「Amazonがシステムに保存するのは秘密鍵の「ハッシュ」です」と言い、次に「Amazonが秘密鍵のコピーを検索する」と言います。これらは互いに矛盾しているようです。最初の発言は間違っていると思います。
Sean

3
このURLは、Amazon S3 Auth実装の詳細を示しています-docs.aws.amazon.com/AmazonS3/latest/dev/S3_Authentication2.html
asyncwait

10
「理論的には、あるものを別のものにマッピングする数学関数は逆にすることができます」-事実ではありません。ハッシュ関数がその例です。表示するのは非常に簡単です。値の合計に基づいて単語を数値に変換する関数があるとします(a = 1、b = 2、c = 3など)。たとえば、 "SO"は18 + 14 = 32です。したがって、SOを32に変更しましたが、この関数を誰かに公開して番号32を与えると、基本的な単語が "SO"であるかどうかを彼が知ることはできません。 「ZF」(26 + 6)またはその他の多数の可能性の1つ
レオ

1
@asyncwaitがリンクしたドキュメントによると、amazonはハッシュだけではなく、確実に秘密鍵を保存します。実際、HMAC関数の内部で発生していることだけがハッシングのようです
カウリネーター

7

公開鍵暗号は、非常に特殊な攻撃から防御するために使用されます。その一部は一般的です。簡単に言えば、これは複雑な計算であり、公開鍵だけを知っていても、個人が公開鍵と秘密鍵のペアを持っていることを確認できます。これは、クレジットカードや静的なパスワードとは大きく異なります。例として、OpenSSHサーバーで認証している場合、サーバーは秘密鍵を必要としません

攻撃される可能性のあるAmazonのAPIデータベースに攻撃者が公開鍵のリストがあり、この情報を使用してユーザーのAPIにアクセスできない場合が理想的です。ただし、理想的なシステムが常に実施されているわけではなく、Amazonがこの攻撃経路から保護しているかどうかはわかりませんが、そうである必要があります。

公開鍵認証では、統計的に総当たり攻撃の影響を受けません。多くの場合、パスワードは辞書の単語であり、相対性理論をすばやく破ることができます。ただし、秘密鍵は膨大な数であり、簡単に推測することはできません。攻撃者が公開鍵を持っている場合、スーパーコンピュータ上で多くの推測を「オフライン」で実行できますが、それでも鍵を破るには多くの時間とお金がかかります。


2
プライベートキーは必要ありませんリンクは現在壊れています。
setzamora 2016年

@Josetは、2008年からインターネットウェイバックマシンのコピーを指すリンクを更新しました
オリゴフレン2018年

1

AWSは独自のカスタム認証アルゴリズムを設計しました。v4は2014年にリリースされました。詳細の概要は、リクエストの認証(AWS署名バージョン4)です。重要な点は、リクエストはシークレット自体では署名されておらず、シークレットを使用して生成された署名鍵で署名されていることです。また、署名にはHMAC-SHA256を使用します。

署名の生成

AWSはユーザーとAWSの両方が格納するシークレットではなく公開キーのみを格納するため、非対称キーを使用する方が安全です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.