web-dev-qa-db-ja.com

クライアント側で公開鍵を使用して文字列を暗号化し、秘密鍵を使用してバックエンドで復号化します

私はクライアント側にAndroidアプリがあり、暗号化された文字列をPHPに実装されたサーバーに送信する必要があります。このために、非対称アルゴリズム(RSA)を選択しました。

したほうがいい:

  • クライアント側で公開鍵を保存し、これを暗号化に使用してから、秘密鍵と暗号化された文字列をバックエンドに送信します

または:

  • 最初にバックエンドから公開鍵を取得してから暗号化を実行し、暗号化された文字列をバックエンドにのみ送信します

どちらも十分でない場合、誰もが最もフォローされている練習を提案できますか?

1
Navneet Krishna

独自の暗号を実装するとエラーが発生しやすいので、そうしないでください。

アプリとバックエンドの間で転送中のデータを暗号化しようとしている場合(つまり、その送信の機密性を提供しようとしている場合)、HTTPS接続を使用するだけで十分である可能性があります。これで、アプリとサーバーの両方に暗号化されていないメッセージが表示されます。

アプリを実行しているデバイスによって信頼されているすべての認証局が、サイトの証明書を発行できることに注意してください。これは、暗号化されたトラフィックを傍受するためにビジネスネットワークで頻繁に使用されますが、通常はエンドユーザーの知識が必要です。アプリが正しい証明書を固定していればこれを防ぐことができますが、サーバー上の証明書を変更する必要がある場合はアプリが破損する可能性があります。これは一般的に行うべきことではありませんが、機密性の高いデータを扱う場合は、HTTPSの制限に注意することが重要です。HTTPSは機密性を提供しますが、必ずしも認証とは限りません。

HTTPSは2番目の例とほぼ同じように機能します。サーバーは公開鍵を提供します。このキーは、認証局(CA)によって署名されています。 CAは、この公開鍵が接続しているドメインに属していることを確認することになっています。エンドユーザーデバイスが署名CAを信頼すると、キーが受け入れられます。これで、クライアントはサーバーの公開鍵を使用してサーバーにメッセージを送信でき、サーバーのみがこのメッセージをデコードできます。これは、より効率的な通信を可能にする、短命の対称セッションキーをネゴシエートするために使用されます。シークレットセッションキーが交換されたので、サーバーとクライアントは暗号化されたチャネルを介して相互に通信できます。

privateキーは送信しないでください。パブリック/プライベート暗号化の要点は、メッセージを復号化するために秘密鍵を共有する必要がないということです。

3
amon