20

私のサイトから送信されたときに、ユーザー エージェントが他のサイトに渡すデータの小さな文字列 (1kb 未満) があります。他のサイトが文字列を作成したのが私であることを確認するために、2 つの選択肢があります。

  1. サーバーは確認のために ping を返してきます (paypal、openid など)。
  2. メッセージを送信したことを証明するために公開/秘密鍵を使用します (PGP、DKIM など)。

HMAC をセットアップしたくありません。サイトごとにカスタム キーを使用する必要があり、面倒だからです。

これら 2 つの選択肢のうち、2 番目の方が帯域幅を節約できるようで、より良い選択のように思えます。

では、PHP を使用して公開鍵/秘密鍵の暗号化をどのようにセットアップできますか?欠点はありますか?

4

4 に答える 4

38

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";
于 2016-02-09T10:08:15.183 に答える
10

OpenSSL を使用して S/MIME 公開/秘密鍵ペアを作成し、OpenSSL コマンドを使用して暗号化と復号化を行います。openssl はほとんどの Linux オペレーティング システムに含まれていますが、PGP は含まれていないため、これは PGP を使用するよりも優れていると思います。また、OpenSSL は標準ベースであり、コマンドを実行すると、一般的に簡単に操作できます。

私は「純粋な PHP」ソリューションに反対することを推奨しました (純粋な PHP とは、PHP を使用して既存のライブラリまたは別の実行可能ファイルを呼び出すのではなく、PHP で暗号化を行うことを意味します)。PHP で一括暗号化を行いたくない場合。遅すぎる。また、OpenSSL はパフォーマンスが高く、セキュリティが十分に理解されているため、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 を使用するデモもいくつかあります。

于 2011-01-14T04:04:41.397 に答える
3

ルール 1: 自分で実装せず、ライブラリを使用する。

どの図書館?私が推奨する PHP 公開鍵暗号化ライブラリは次のとおりです。

  1. Haliteは libsodiumに依存します (ただし、セキュリティに加えてシンプルさと使いやすさを重視しています)。
  2. libsodium、PECL から
  3. 最も安全なモードで RSA を使用して安全な公開鍵暗号化と公開鍵署名を実装する EasyRSA (これまでの PKCS1v1.5 ではありません! )
  4. EasyRSAがピギーバックする phpseclib 。

一般に、セキュリティが目的の場合は libsodium が必要です。岩塩を使用するかどうかは好みの問題です。

于 2015-12-09T07:48:49.473 に答える
2

PGP は適切なオプションです。適切かつ完全に実装されています (つまり、PGP ではセキュリティ上のミスが生じる余地がほとんどありません)。このSOの質問は、GnuPGとのインターフェースに役立つと思います。問題は、他のサイトがあなたの署名を検証するかどうか、およびその方法です。検証メカニズムの要件に準拠するか、それらのサイトが検証に使用する独自のモジュールを提供する必要があります。

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

于 2011-01-07T19:46:04.183 に答える