Jak szyfrować dane w php za pomocą kluczy publicznych / prywatnych?

Mam mały ciąg niektórych danych (mniej niż 1KB), które chciałbym, aby agenci użytkownika przekazywali innym witrynom, gdy są wysyłane z mojej witryny. Aby inne strony zweryfikowały, że to ja stworzyłem ciąg, który myślałem o dwóch opcjach.

  1. Serwer pingi mnie z powrotem do potwierdzenia (jak paypal, openid, itp..)
  2. używam kluczy publicznych / prywatnych, aby udowodnić, że wysłałem wiadomość (jak PGP, DKIM, itp..)

Nie chcę ustawiać HMAC, bo to by oznaczało, że trzeba używać niestandardowych kluczy dla każdej witryny, co byłoby bólem.

Z tych dwóch opcji wydaje się, że #2 zaoszczędzi na przepustowości, co sprawia, że wydaje się lepszym wyborem.

Jak więc skonfigurować kryptografię klucza publicznego / prywatnego za pomocą PHP i czy są jakieś wady?

Author: Scott Arciszewski, 2011-01-07

5 answers

Stworzyłbym publiczne / prywatne klawiatury S / MIME używając OpenSSL, a następnie użyłbym polecenia OpenSSL do szyfrowania i deszyfrowania. Uważam, że jest to lepsze niż używanie PGP, ponieważ openssl jest dołączony do większości systemów operacyjnych linux, a PGP nie jest. OpenSSL jest również oparty na standardach i ogólnie łatwiejszy do pracy, gdy masz wyłączone polecenia.

Polecam przeciwko rozwiązaniu "pure-PHP" (przez pure-PHP mam na myśli Robienie krypto w PHP, a nie używanie PHP do wywoływania istniejącego biblioteki lub osobnego pliku wykonywalnego). Nie chcesz robić masowych krypto w PHP. Za wolno. I chcesz używać OpenSSL, ponieważ jest to wysoka wydajność i bezpieczeństwo jest dobrze zrozumiane.

Oto Magia.

Aby utworzyć klucz X. 509:

$subj="/C=US/ST=California/L=Remote/O=Country Govt./OU=My Dept/CN=Mr. Agent/[email protected]"
openssl req -x509 -newkey rsa:1024 -keyout mycert.key -out mycert.pem -nodes -subj $subj

To umieszcza klucz prywatny w mycert.klucz i klucz publiczny w mycert.pem. Klucz prywatny nie jest chroniony hasłem.

Teraz, aby podpisać wiadomość za pomocą S/MIME:

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

Aby zaszyfrować wiadomość za pomocą S / MIME:

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

Aby odszyfrować wiadomość za pomocą S/MIME:

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

Mam też kilka dem na temat używania OpenSSL z powiązań języka C, ale nie z PHP.

 9
Author: vy32,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-18 15:14:07

Tworzenie pary kluczy prywatnych i publicznych przy użyciu funkcji 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"];

Możesz następnie zaszyfrować i odszyfrować za pomocą kluczy prywatnych i publicznych, takich jak:

// 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";
 7
Author: Eborbob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-09 10:08:15

Zasada 1: nie wdrażaj tego samodzielnie, użyj biblioteki.

Która biblioteka? Oto moje zalecane biblioteki kryptograficzne PHP z kluczem publicznym :

  1. Halite , zależy od libsodium (ale podkreśla prostotę i łatwość użycia oprócz bezpieczeństwa).
  2. libsodium , z PECL
  3. [16]} EasyRSA , która implementuje bezpieczne szyfrowanie klucza publicznego i sygnatury klucza publicznego przy użyciu RSA w najbezpieczniejszych trybach (nie PKCS1v1.5, nigdy!)
  4. phpseclib , z którego EasyRSA się wycofuje.

Ogólnie rzecz biorąc, będziesz chciał libsodium, jeśli Bezpieczeństwo jest twoim celem. To, czy używasz halitu, czy nie, jest kwestią gustu.

 3
Author: Scott Arciszewski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-09 07:48:49

PGP jest dobrym rozwiązaniem - jest zaimplementowany poprawnie i całkowicie(tzn. nie ma miejsca na błędy bezpieczeństwa w PGP). Myślę, że to pytanie So pomoże Ci w połączeniu z GnuPG. Pytanie brzmi, czy i w jaki sposób inne strony zweryfikują twój podpis. Musisz albo dostosować się do ich wymagań dotyczących mechanizmu weryfikacji, albo dostarczyć własny moduł, który witryny te będą wykorzystywać do weryfikacji.

Jest również możliwe, że możesz użyć OAuth lub OpenID, aby zidentyfikuj użytkowników na innych stronach, ale nie jestem ekspertem w tych technologiach.

 2
Author: Eugene Mayevski 'Allied Bits,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:30:49

Napisałem przykład szyfrowania i deszyfrowania za pomocą openSSL w PHP i Pythonie

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

Dostępny Kod źródłowy Github.

Nie zapominaj, że klucz prywatny musi być dostępny w miejscu odszyfrowania, aby to zadziałało.

 1
Author: GlynRob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-19 22:56:02