Jaki jest najprostszy sposób szyfrowania dwukierunkowego w typowych instalacjach PHP?
Muszę być w stanie zaszyfrować dane za pomocą klucza łańcuchowego i użyć tego samego klucza do odszyfrowania na drugim końcu.
Bezpieczeństwo nie jest tak dużym problemem, jak przenośność kodu, dlatego chciałbym mieć prostotę. Obecnie używam implementacji RC4, ale jeśli mogę znaleźć coś natywnie obsługiwanego, sądzę, że mogę zaoszczędzić wiele niepotrzebnego kodu.
php
security
encryption
cryptography
encryption-symmetric
użytkownik1206970
źródło
źródło
Sodium::crypto_secretbox()
iSodium::crypto_secretbox_open()
są bezpieczne i wydajne.Odpowiedzi:
Edytowane:
Naprawdę powinieneś używać openssl_encrypt () i openssl_decrypt ()
Jak mówi Scott , Mcrypt nie jest dobrym pomysłem, ponieważ nie był aktualizowany od 2007 roku.
Istnieje nawet RFC do usunięcia Mcrypta z PHP - https://wiki.php.net/rfc/mcrypt-viking-funeral
źródło
Ważne : Jeżeli nie masz bardzo szczególne zastosowanie przypadku, Nie należy szyfrować hasła , należy użyć algorytmu mieszającego hasło. Kiedy ktoś mówi, że szyfruje swoje hasło w aplikacji po stronie serwera, jest albo niedoinformowany, albo opisuje niebezpieczny projekt systemu. Bezpieczne przechowywanie haseł to zupełnie inny problem niż szyfrowanie.
Być poinformowanym. Projektuj bezpieczne systemy.
Przenośne szyfrowanie danych w PHP
Jeśli używasz PHP 5.4 lub nowszego i nie chcesz samodzielnie pisać modułu kryptograficznego, zalecamy użycie istniejącej biblioteki, która zapewnia uwierzytelnianie szyfrowane . Biblioteka, którą podłączyłem, opiera się tylko na tym, co zapewnia PHP i jest okresowo sprawdzana przez garść badaczy bezpieczeństwa. (Ja w tym.)
Jeśli twoje cele w zakresie przenoszenia nie zapobiegają wymaganiu rozszerzeń PECL, libsodium jest wysoce zalecane w stosunku do wszystkiego, co możesz napisać w PHP.
Aktualizacja (2016-06-12): Możesz teraz używać sodu_kompat i korzystać z tych samych ofert krypto-libsodium bez instalowania rozszerzeń PECL.
Jeśli chcesz spróbować swoich sił w inżynierii kryptograficznej, czytaj dalej.
Po pierwsze, powinieneś poświęcić czas na poznanie niebezpieczeństw związanych z nieuwierzytelnionym szyfrowaniem i zasadą Cryptographic Doom .
Szyfrowanie i deszyfrowanie
Szyfrowanie w PHP jest faktycznie proste (będziemy używać
openssl_encrypt()
iopenssl_decrypt()
po dokonaniu pewnych decyzji dotyczących sposobu szyfrowania informacji Consult.openssl_get_cipher_methods()
O listę obsługiwanych metod w systemie Najlepszym wyborem jest. AES w trybie CTR :aes-128-ctr
aes-192-ctr
aes-256-ctr
Obecnie nie ma powodu, aby sądzić, że rozmiar klucza AES jest poważnym problemem, o który należy się martwić (prawdopodobnie większy nie jest lepszy, z powodu złego planowania klucza w trybie 256-bitowym).
Uwaga: nie korzystamy z
mcrypt
niego, ponieważ jest to porzucone oprogramowanie i zawiera niezałatane błędy, które mogą mieć wpływ na bezpieczeństwo. Z tych powodów zachęcam również innych programistów PHP, aby tego unikali.Proste opakowanie szyfrowania / deszyfrowania za pomocą OpenSSL
Przykład użycia
Demo : https://3v4l.org/jl7qR
Powyższa prosta biblioteka kryptograficzna nadal nie jest bezpieczna w użyciu. Musimy uwierzytelnić teksty zaszyfrowane i zweryfikować je przed odszyfrowaniem .
Uwaga : Domyślnie
UnsafeCrypto::encrypt()
zwraca surowy ciąg binarny. Nazwij to tak, jeśli chcesz przechowywać go w formacie binarnie bezpiecznym (zakodowanym w base64):Demo : http://3v4l.org/f5K93
Proste opakowanie uwierzytelnienia
Przykład użycia
Dema : surowe pliki binarne , zakodowane w base64
Jeśli ktoś chce użyć tej
SaferCrypto
biblioteki w środowisku produkcyjnym lub własnej implementacji tych samych pojęć, zdecydowanie zalecamy skontaktowanie się z lokalnymi kryptografami w celu uzyskania drugiej opinii. Będą mogli powiedzieć ci o błędach, których być może nawet nie będę świadomy.Lepiej skorzystasz z renomowanej biblioteki kryptograficznej .
źródło
Użyj
mcrypt_encrypt()
imcrypt_decrypt()
z odpowiednimi parametrami. Naprawdę łatwe i proste, a używasz sprawdzonego w bitwie pakietu szyfrującego.EDYTOWAĆ
5 lat i 4 miesiące po tej odpowiedzi
mcrypt
rozszerzenie jest obecnie w fazie wycofywania i ostatecznego usunięcia z PHP.źródło
PHP 7.2 całkowicie się odsunął,
Mcrypt
a szyfrowanie jest teraz oparte na łatwym do utrzymaniaLibsodium
bibliotece, którą można .Wszystkie potrzeby szyfrowania można w zasadzie rozwiązać za pomocą
Libsodium
biblioteki.Dokumentacja Libsodium: https://github.com/paragonie/pecl-libsodium-doc
źródło
crypto_sign
API czy nie szyfrować wiadomości - że wymagać będzie jedną zcrypto_aead_*_encrypt
funkcji.WAŻNY ta odpowiedź jest ważna tylko dla PHP 5, w PHP 7 używaj wbudowanych funkcji kryptograficznych.
Oto prosta, ale wystarczająco bezpieczna implementacja:
Kod i przykłady są tutaj: https://stackoverflow.com/a/19445173/1387163
źródło