パブリック/プライベートキーを使用してPHPでデータを暗号化する方法は?

StackOverflow https://stackoverflow.com/questions/4629537

質問

ユーザーエージェントがサイトから送信されたときに他のサイトに通過させたいといういくつかのデータ(1kb未満)の小さな文字列があります。他のサイトが私が2つのオプションの弦Iを作成したサイトであることを確認するために。

  1. サーバーは私をpaypal、openidなどのように戻ってきました。
  2. パブリック/プライベートキーを使用して、メッセージを送信したことを証明します(PGP、DKIMなど)

HMACをセットアップしたくありません。それは、痛みになるサイトごとにカスタムキーを使用する必要があることを意味するからです。

これらの2つの選択のうち、#2は帯域幅を節約するため、より良い選択のように思われます。

では、どのようにしてPHPを使用してパブリック/プライベートキーの暗号をセットアップでき、欠点はありますか?

役に立ちましたか?

解決

openSSLを使用してs/mime public/private keypairsを作成し、OpenSSLコマンドを使用して暗号化と復号化を行います。 OpenSSLはほとんどのLinuxオペレーティングシステムに含まれており、PGPはそうではないため、これはPGPの使用よりも優れていると思います。 OpenSSLは標準ベースでもあり、コマンドをダウンしたら、一般的に作業しやすくなります。

「Pure-PHP」ソリューションに対して推奨しました(Pure-PHPとは、PHPを使用して既存のライブラリまたは別の実行可能ファイルを呼び出すのではなく、PHPで暗号を行うことを意味します)。 PHPでバルククリプトをしたくありません。遅すぎる。また、OpenSSLは高性能であり、セキュリティがよく理解されているため、使用したいと考えています。

これが魔法です。

x.509キーを作成するには:

$subj="/C=US/ST=California/L=Remote/O=Country Govt./OU=My Dept/CN=Mr. Agent/emailAddress=agent@investiations.com"
openssl req -x509 -newkey rsa:1024 -keyout mycert.key -out mycert.pem -nodes -subj $subj

これにより、mycert.keyとmycert.pemの公開鍵に秘密鍵が置かれます。秘密鍵はパスワード保護されていません。

ここで、s/mimeでメッセージに署名するには:

openssl smime -sign -signer mycert.pem -inkey mycert.key <input >output

s/mimeでメッセージを暗号化するには:

openssl smime -encrypt -recip yourcert.pem <input >output

s/mimeでメッセージを復号化するには:

openssl smime -decrypt -inkey mycert.key -certfile mycert.pem <input >output

また、PHPからではなく、C言語のバインディングからOpenSSLを使用するデモもあります。

他のヒント

PHP OpenSSL関数を使用してプライベートキーと公開キーペアを作成します。

// Configuration settings for the key
$config = array(
    "digest_alg" => "sha512",
    "private_key_bits" => 4096,
    "private_key_type" => OPENSSL_KEYTYPE_RSA,
);

// Create the private and public key
$res = openssl_pkey_new($config);

// Extract the private key into $private_key
openssl_pkey_export($res, $private_key);

// Extract the public key into $public_key
$public_key = openssl_pkey_get_details($res);
$public_key = $public_key["key"];

次に、このようなプライベートキーとパブリックキーを使用して暗号化および復号化できます。

// Something to encrypt
$text = 'This is the text to encrypt';

echo "This is the original text: $text\n\n";

// Encrypt using the public key
openssl_public_encrypt($text, $encrypted, $public_key);

$encrypted_hex = bin2hex($encrypted);
echo "This is the encrypted text: $encrypted_hex\n\n";

// Decrypt the data using the private key
openssl_private_decrypt($encrypted, $decrypted, $private_key);

echo "This is the decrypted text: $decrypted\n\n";

ルール1:自分で実装しないで、ライブラリを使用してください。

どの図書館? これが私の推奨されるPHPパブリックキー暗号化ライブラリです:

  1. ハロイト, 、リブソジウムに依存します(ただし、セキュリティに加えて、単純さと使いやすさを強調しています)。
  2. libsodium, 、peclから
  3. easyrsa, 、最も安全なモードでRSAを使用して安全な公開キー暗号化とパブリックキーの署名を実装します(PKCS1v1.5ではなく!)
  4. phpseclib, 、yeadyrsaが豚をぶら下げます。

一般に、セキュリティがあなたの目標である場合、Libsodiumが必要です。ハライトを使用するかどうかは味の問題です。

PGPは良いオプションです - それは適切かつ完全に実装されています(つまり、PGPとのセキュリティ間違いの余地はほとんどありません)。おもう これはとても質問です Gnupgとのインターフェースをお勧めします。問題は、他のサイトが署名を確認するかどうか、どのように検証するかです。検証メカニズムの要件に準拠するか、それらのサイトが検証に使用する独自のモジュールを提供する必要があります。

また、OAuthまたはOpenIDを使用して他のサイトのユーザーを識別できる可能性もありますが、私はこれらのテクノロジーの専門家ではありません。

PHPとPythonでOpenSSLを使用して暗号化と復号化の例を書きました

http://glynrob.com/php/hashing-and-public-key-encryption/

GitHubソースコードが利用可能。

これが機能するためには、秘密鍵が復号化の場所で利用可能である必要があることを忘れないでください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top