Chodzi mi o to że:
Original String + Salt or Key --> Encrypted String
Encrypted String + Salt or Key --> Decrypted (Original String)
Może coś takiego:
"hello world!" + "ABCD1234" --> Encrypt --> "2a2ffa8f13220befbe30819047e23b2c" (may be, for e.g)
"2a2ffa8f13220befbe30819047e23b2c" --> Decrypt with "ABCD1234" --> "hello world!"
- Jak to zrobić w PHP?
Próbowałem użyć Crypt_Blowfish
, ale nie działało to dla mnie.
Odpowiedzi:
Zanim zrobisz cokolwiek dalej, spróbuj zrozumieć różnicę między szyfrowaniem a uwierzytelnianiem i dlaczego prawdopodobnie chcesz szyfrowania uwierzytelnionego, a nie tylko szyfrowania .
Aby zaimplementować uwierzytelnianie szyfrowane, chcesz zaszyfrować, a następnie MAC. Kolejność szyfrowania i uwierzytelniania jest bardzo ważna! Jedna z istniejących odpowiedzi na to pytanie popełniła ten błąd; podobnie jak wiele bibliotek kryptograficznych napisanych w PHP.
Należy unikać wdrażania własnej kryptografii , a zamiast tego korzystać z bezpiecznej biblioteki napisanej i sprawdzonej przez ekspertów w dziedzinie kryptografii.
Użyj libsodium, jeśli masz dostęp do PECL (lub sodu_compat, jeśli chcesz libsodium bez PECL); w przeciwnym razie ...
Użyj szyfrowania / defuse / php ; nie rzucaj własną kryptografią!
Obie wyżej wymienione biblioteki ułatwiają i bezbolesne wdrożenie uwierzytelnionego szyfrowania we własnych bibliotekach.
Jeśli nadal chcesz pisać i wdrażać własną bibliotekę kryptograficzną, wbrew konwencjonalnej wiedzy każdego eksperta w dziedzinie kryptografii w Internecie, musisz wykonać te kroki.
Szyfrowanie:
Deszyfrowanie:
hash_equals()
. Jeśli to się nie powiedzie, przerwij.Inne uwagi dotyczące projektu:
mb_strlen()
imb_substr()
, używając'8bit'
trybu zestawu znaków, aby zapobiecmbstring.func_overload
problemom.mcrypt_create_iv()
, NIE UŻYWAJMCRYPT_RAND
!bin2hex()
,base64_encode()
itp. mogą wyciekać informacje o twoich kluczach szyfrujących poprzez synchronizację pamięci podręcznej. Unikaj ich, jeśli to możliwe.Nawet jeśli zastosujesz się do podanych tu wskazówek, wiele może pójść nie tak z kryptografią. Zawsze poproś eksperta od kryptografii o sprawdzenie Twojej implementacji. Jeśli nie masz szczęścia, aby być osobistym przyjacielem studenta kryptografii na lokalnym uniwersytecie, zawsze możesz skorzystać z forum Cryptography Stack Exchange w celu uzyskania porady.
Jeśli potrzebujesz profesjonalnej analizy swojego wdrożenia, zawsze możesz zatrudnić renomowany zespół konsultantów ds. Bezpieczeństwa, aby sprawdzili Twój kod kryptograficzny PHP (ujawnienie: mój pracodawca).
Ważne: kiedy nie używać szyfrowania
Nie szyfruj haseł . Chcesz hash nich zamiast, korzystając z jednej z tych algorytmów mieszania hasłem:
Nigdy nie używaj funkcji skrótu ogólnego przeznaczenia (MD5, SHA256) do przechowywania haseł.
Nie szyfruj parametrów adresów URL . To nieodpowiednie narzędzie do pracy.
Przykład szyfrowania łańcucha PHP za pomocą Libsodium
Jeśli korzystasz z PHP <7.2 lub w inny sposób nie masz zainstalowanego libsodium, możesz użyć sodium_compat, aby osiągnąć ten sam wynik (choć wolniej).
Następnie, aby to przetestować:
Halite - Libsodium Made Easy
Jednym z projektów, nad którymi pracuję, jest biblioteka szyfrowania o nazwie Halite , która ma na celu uczynienie libsodium łatwiejszym i bardziej intuicyjnym.
Cała kryptografia jest obsługiwana przez libsodium.
Przykład z defuse / php-encryption
Uwaga :
Crypto::encrypt()
zwraca dane wyjściowe w formacie szesnastkowym.Zarządzanie kluczami szyfrującymi
Jeśli masz ochotę użyć „hasła”, przestań już teraz. Potrzebujesz losowego 128-bitowego klucza szyfrowania, a nie hasła, które można zapamiętać.
Możesz przechowywać klucz szyfrujący do długoterminowego użytku, tak jak:
I na żądanie możesz go pobrać w następujący sposób:
I zdecydowanie zalecamy tylko przechowywanie losowo wygenerowanego klucza do długotrwałego stosowania zamiast jakichkolwiek hasła jako klucza (lub w celu uzyskania klucza).
Jeśli korzystasz z biblioteki Defuse:
$string = $keyObject->saveToAsciiSafeString()
$loaded = Key::loadFromAsciiSafeString($string);
„Ale naprawdę chcę użyć hasła”.
To zły pomysł, ale dobrze, oto jak to zrobić bezpiecznie.
Najpierw wygeneruj losowy klucz i zapisz go w stałej.
Pamiętaj, że dodajesz dodatkową pracę i możesz użyć tej stałej jako klucza i zaoszczędzić sobie dużo bólu serca!
Następnie użyj PBKDF2 (podobnie jak ten), aby uzyskać odpowiedni klucz szyfrowania na podstawie hasła zamiast szyfrować go bezpośrednio.
Nie używaj tylko 16-znakowego hasła. Twój klucz szyfrujący zostanie komicznie zepsuty.
źródło
password_hash()
i sprawdzaj za pomocąpassword_verify()
.function getKeyFromPassword($password, $keysize = \Sodium\CRYPTO_SECRETBOX_KEYBYTES)
Jestem spóźniony na imprezę, ale szukając właściwego sposobu, by to zrobić, natknąłem się na tę stronę, która była jednym z najlepszych wyników wyszukiwania w Google, więc chciałbym podzielić się swoją opinią na temat problemu, który uważam za aktualne w momencie pisania tego postu (początek 2017 r.). Od PHP 7.1.0
mcrypt_decrypt
imcrypt_encrypt
będzie przestarzałe, więc przy tworzeniu przyszłego kodu sprawdzającego należy użyć openssl_encrypt i openssl_decryptMożesz zrobić coś takiego:
Możesz również użyć innych metod rozdrabniacza, w zależności od potrzeb bezpieczeństwa. Aby dowiedzieć się o dostępnych metodach rębaka, zobacz funkcję openssl_get_cipher_methods .
źródło
prod_id=123
ale po prostu nie chcę, aby 123 był czytelny dla wszystkich, jednak nawet gdyby mogli go odczytać, nie będzie problemu. Atakujący, który może zamienić 123 na wartość niestandardową, nie spowoduje żadnej szkody, będzie mógł uzyskać jedynie szczegóły dotyczące jakiegokolwiek innego produktu, ale przeciętny użytkownik Joe nie będzie miał pojęcia, jak uzyskać szczegółowe informacje na temat na przykład produkt 124. W takim scenariuszu jest to idealne rozwiązanie, dla bezpieczeństwa nie ma mowy!Czego nie robić
Mam to na sobie. Właściwie znalazłem odpowiedź na google i właśnie coś zmodyfikowałem. Rezultat jest jednak całkowicie niepewny.
źródło
base64_encode(encrypt($string))
- Aby je odszyfrować:decrypt(base64_decode($encrypted))
mcrypt_encrypt
zastąpienie przykładowego kodu : php.net/manual/en/function.mcrypt-encrypt.php . Zauważ, że przejrzenie go teraz powinno mieć na końcurtrim
postać for"\0"
.Dla frameworka Laravel
Jeśli używasz frameworka Laravel, łatwiej jest go zaszyfrować i odszyfrować za pomocą funkcji wewnętrznych.
źródło
Zaktualizowano
Wersja gotowa na PHP 7. Wykorzystuje funkcję openssl_encrypt z biblioteki PHP OpenSSL .
źródło
Zostawiłem tę odpowiedź do celów historycznych - ale niektóre metody są obecnie przestarzałe, metoda szyfrowania DES nie jest zalecaną praktyką itp.
Nie zaktualizowałem tego kodu z dwóch powodów: 1) Nie pracuję już ręcznie metodami szyfrowania w PHP i 2) Ten kod nadal służy celowi, do którego został przeznaczony: w celu zademonstrowania minimalnej, uproszczonej koncepcji działania szyfrowania w PHP.
Jeśli znajdziesz podobnie uproszczone źródło „Szyfrowanie PHP dla manekinów”, które może zacząć od 10-20 linii kodu, daj mi znać w komentarzach.
Ponadto zapraszamy do obejrzenia klasycznego odcinka minimalistycznej odpowiedzi na szyfrowanie we wczesnej epoce PHP4.
Idealnie masz - lub możesz uzyskać - dostęp do biblioteki PHP mcrypt, ponieważ jest to z pewnością popularna i bardzo przydatna różnorodność zadań. Oto przegląd różnych rodzajów szyfrowania i przykładowy kod: Techniki szyfrowania w PHP
Kilka ostrzeżeń:
1) Nigdy nie używaj szyfrowania odwracalnego lub „symetrycznego”, gdy działa skrót jednokierunkowy.
2) Jeśli dane są naprawdę wrażliwe, takie jak numer karty kredytowej lub numer ubezpieczenia społecznego, przestań; potrzebujesz więcej niż zapewnia zwykła porcja kodu, ale potrzebujesz biblioteki kryptograficznej zaprojektowanej do tego celu i znacznej ilości czasu na zbadanie niezbędnych metod. Co więcej, oprogramowanie szyfrujące stanowi prawdopodobnie <10% bezpieczeństwa wrażliwych danych. To jak przeprojektowanie elektrowni jądrowej - zaakceptuj, że zadanie jest niebezpieczne i trudne i poza twoją wiedzą, jeśli tak jest. Kary finansowe mogą być ogromne, więc lepiej skorzystać z usługi i wysłać na nie odpowiedzialność.
3) Każdy rodzaj łatwego do wdrożenia szyfrowania, wymienionego tutaj, może w rozsądny sposób chronić mało ważne informacje, które chcesz chronić przed wścibskimi oczami lub ograniczyć narażenie w przypadku przypadkowego / umyślnego wycieku. Ale widząc, jak klucz jest przechowywany w postaci zwykłego tekstu na serwerze sieciowym, jeśli mogą uzyskać dane, mogą uzyskać klucz odszyfrowujący.
Tak czy inaczej, baw się dobrze :)
źródło
M�������f=�_=
dziwne postacie jako zaszyfrowane. Czy nie mogę uzyskać prostych znaków? Jak:2a2ffa8f13220befbe30819047e23b2c
. Czy nie mogę także zmienić DŁUGOŚCI$key_value
(ustalonej na 8 ???) i DŁUGOŚCI wyjścia$encrypted_text
? (czy nie może być 32 lub 64 długości, czy cokolwiek dłuższego ??)MCRYPT_RIJNDAEL_128
), a zaszyfrowane teksty powinny być uwierzytelnione (hash_hmac()
, zweryfikowane zhash_equals()
).Jeśli nie chcesz używać biblioteki (co powinieneś), użyj czegoś takiego (PHP 7):
źródło
define("ENCRYPTION_KEY", "123456*"); $string = "This is the original data string!"; $encrypted = openssl_encrypt($string, 'BF-ECB', ENCRYPTION_KEY); $decrypted = openssl_decrypt($encrypted,'BF-ECB',ENCRYPTION_KEY);
Są to kompaktowe metody szyfrowania / deszyfrowania ciągów za pomocą PHP przy użyciu AES256 CBC :
Stosowanie:
źródło
Poniższy kod działa w php dla wszystkich ciągów znaków specjalnych
źródło