Verschlüsselung in PHP. Verschlüsseln und entschlüsseln Sie Daten mit einem Schlüssel in PHP-Verschlüsselungs- und Authentifizierungsschlüsseln

  • Übersetzung
  • Lernprogramm

Vom Übersetzer: Beim Programmieren vergesse ich nie, dass ich in der Kryptographie gefährlich inkompetent bin, und ich rate jedem, von dieser These auszugehen (naja, vielleicht außer Ihnen und dem coolen Kerl da drüben). Allerdings treten im Laufe der Arbeit auf die eine oder andere Weise Probleme im Zusammenhang mit dem Datenschutz auf, die gelöst werden müssen. Deshalb mache ich Sie auf die Übersetzung eines Artikels des finnischen Entwicklers Timo H aufmerksam, den ich sehr interessant und nützlich fand.

Dies ist eine Kurzanleitung, wie Sie häufige Fallstricke bei der symmetrischen Verschlüsselung in PHP vermeiden können.

Wir betrachten den Fall, dass die Daten serverseitig verarbeitet werden (insbesondere erfolgt die Verschlüsselung serverseitig und die Daten können beispielsweise vom Client in Form von Klartext, Passwort etc. empfangen werden), Dies ist ein typischer Fall für PHP-Anwendungen.

Die Informationen in diesem Handbuch sollten nicht zum Erstellen verschlüsselter Netzwerkverbindungen mit komplexeren Anforderungen verwendet werden. In solchen Fällen müssen Sie Spionage oder TLS verwenden.

Natürlich sind die hier gegebenen Empfehlungen nicht die „einzige Möglichkeit“, die Verschlüsselung in PHP zu organisieren. Der Zweck dieses Leitfadens besteht darin, weniger Raum für Fehler und schwierige, mehrdeutige Entscheidungen zu lassen.

Verschlüsselungsfunktionen in PHP

Verwenden Sie Mcrypt- oder OpenSSL-Erweiterungen.

Verschlüsselungsalgorithmus und seine Funktionsweise, Einmalcode (Initialisierungsvektor)

Verwenden Sie AES-256 im CTR-Modus mit einem zufälligen Einmalcode ( ca. Übersetzung: Nonce). AES ist ein Standard, sodass Sie die Funktionen aller Erweiterungen nutzen können – Mcrypt oder OpenSSL.

Generieren Sie immer einen neuen Einmalcode. In diesem Fall müssen Sie eine kryptografisch sichere Zufallszahlenquelle verwenden. Lesen Sie weiter unten etwas mehr über die Generierung von Zufallszahlen. Der Einmalcode ist kein Geheimnis und kann zur Übertragung und anschließenden Entschlüsselung mit Chiffretext verkettet werden.

Der Einmalcode muss 128 Bit (16 Byte) lang sein, also nur eine Folge von Bytes ohne jegliche Codierung.

In der Mcrypt-Erweiterung ist AES als Rijndael-128 bekannt ( ca. Übers.: Obwohl es sich um AES-256 handelt, handelt es sich hierbei nicht um einen Fehler. AES-256 != Rijndael-256). In OpenSSL bzw. AES-256-CTR.

Beispiel für die Verwendung von Mcrypt:
OpenSSL-Beispiel:
Überprüfen Sie mithilfe von Testvektoren, ob die Verschlüsselung ordnungsgemäß funktioniert ( ca. Übersetzung: Für AES-256-CTR siehe Abschnitt F.5.5 auf Seite 57).

Für den CTR-Modus gibt es einige Einschränkungen hinsichtlich des Gesamtvolumens der verschlüsselten Daten. Dies wird Ihnen in der Praxis vielleicht nicht begegnen, aber bedenken Sie, dass Sie nicht mehr als 2^64 Bytes an Daten mit einem Schlüssel verschlüsseln sollten, unabhängig davon, ob es sich um eine lange Nachricht oder viele kurze handelt.

Der CTR-Modus bleibt nur dann stabil, wenn Sie nicht denselben Einmalcode mit demselben Schlüssel verwenden. Aus diesem Grund ist es wichtig, Einmalcodes mithilfe einer kryptografisch starken Zufallsquelle zu generieren. Darüber hinaus bedeutet dies, dass Sie nicht mehr als 2^64 Nachrichten mit einem einzigen Schlüssel verschlüsseln sollten. Da die Länge des Einmalcodes 128 Bit beträgt, ist die Begrenzung der Anzahl der Nachrichten (und ihrer entsprechenden Einmalcodes) von 2^128/2 aufgrund des Geburtstagsparadoxons wichtig ( ca. Übersetzung:).

Und denken Sie daran, dass die Verschlüsselung nicht darüber hinwegtäuschen wird, wie viele Daten Sie senden. Ein Beispiel für einen Extremfall: Wenn Sie Nachrichten verschlüsseln, die nur „Ja“ oder „Nein“ enthalten, werden diese Informationen durch die Verschlüsselung offensichtlich nicht ausgeblendet.

Datenauthentifizierung

Überprüfen Sie stets die Authentizität und Integrität der Daten.
Verwenden Sie dazu MAC nach der Verschlüsselung. Diese. Zuerst werden die Daten verschlüsselt, und dann wird HMAC-SHA-256 aus dem resultierenden Chiffretext entnommen, einschließlich des Chiffretexts selbst und des Einmalcodes.

Überprüfen Sie beim Entschlüsseln zunächst den HMAC mithilfe eines Vergleichsalgorithmus, der gegen Timing-Angriffe resistent ist. Vergleichen Sie $user_submitted_mac und $calculated_mac nicht direkt mit den Vergleichsoperatoren == oder ===. Noch besser ist es, „HMAC Double Check“ zu verwenden.

Wenn die HMAC-Prüfung erfolgreich ist, kann die Entschlüsselung sicher durchgeführt werden. Wenn HMAC nicht geeignet ist, sofort abschalten.

Verschlüsselungs- und Authentifizierungsschlüssel

Verwenden Sie im Idealfall Schlüssel, die aus einer kryptografisch starken Zufallsquelle stammen. AES-256 erfordert 32 Bytes Zufallsdaten (eine „rohe“ Zeichenfolge – eine Folge von Bits ohne Verwendung jeglicher Codierung).

Wenn die Anwendung unter einer PHP-Version unter 5.5 läuft, die keine integrierte Implementierung von PBKDF2 hat, müssen Sie Ihre eigene Implementierung in PHP verwenden, ein Beispiel dafür finden Sie hier: https://defuse. ca/php-pbkdf2.htm. Beachten Sie, dass der Schlüssel möglicherweise nicht ordnungsgemäß aufgelöst wird, wenn Sie sich auf Ihre eigene Implementierung verlassen, wie dies bei der integrierten Funktion hash_pbkdf2() der Fall ist.

Verwenden Sie nicht denselben Schlüssel für Verschlüsselung und Authentifizierung. Wie oben erwähnt, sind 32 Byte für den Verschlüsselungsschlüssel und 32 Byte für den Authentifizierungsschlüssel (HMAC) erforderlich. Mit PBKDF2 können Sie 64 Bytes aus dem Passwort nehmen und beispielsweise die ersten 32 Bytes als Verschlüsselungsschlüssel und die restlichen 32 Bytes als Authentifizierungsschlüssel verwenden.

Wenn Ihre Passwörter in einer Datei gespeichert sind, beispielsweise als HEX-String, kodieren Sie sie nicht erneut, bevor Sie sie den Verschlüsselungsfunktionen übergeben. Verwenden Sie stattdessen PBKDF2, um HEX-codierte Schlüssel direkt in einen hochwertigen Verschlüsselungs- oder Authentifizierungsschlüssel umzuwandeln. Oder verwenden Sie SHA-256 ohne zusätzliche Codierungsausgabe (nur eine 32-Byte-Zeichenfolge), um Passwörter zu hashen. Die Verwendung von regulärem Passwort-Hashing sorgt für ausreichend Entropie. Weitere Einzelheiten finden Sie in den folgenden Absätzen.

Schlüsseldehnung

Erstens sollten Sie die Verwendung von Schlüsseln mit niedriger Entropie vermeiden. Wenn Sie jedoch beispielsweise Benutzerkennwörter verwenden müssen, müssen Sie unbedingt PBKDF2 mit einer großen Anzahl von Iterationen verwenden, um die Schlüsselsicherheit zu maximieren.

Einer der Parameter von PBKDF2 ist die Anzahl der Hashing-Iterationen. Und je höher dieser ist, desto größer ist die Sicherheit des Schlüssels, mit der Sie rechnen können. Wenn Ihr Code auf einer 64-Bit-Plattform ausgeführt wird, verwenden Sie SHA-512 als Hashing-Algorithmus für PBKDF2. Verwenden Sie für eine 32-Bit-Plattform SHA-256.

Allerdings ist es aufgrund der Gefahr eines DoS-Angriffs nicht möglich, in Online-Anwendungen eine relativ hohe Anzahl an Iterationen zu nutzen. Daher wird die Schlüsselqualität nicht so hoch sein wie bei Offline-Anwendungen, die eine große Anzahl von Iterationen ohne ein solches Risiko leisten können. In der Regel wird bei Online-Anwendungen eine solche Anzahl an Hashing-Iterationen gewählt, dass PBKDF2 nicht länger als 100 ms dauert.

Falls Sie Passwörter mit hoher Entropie verwenden können, ist es nicht erforderlich, diese zu dehnen, wie dies bei Passwörtern mit niedriger Entropie der Fall wäre. Wenn Sie beispielsweise mit /dev/urandom einen „encryption_master_key“ und einen „auth_master_key“ erstellen, ist PBKDF2 überhaupt nicht erforderlich. Stellen Sie sicher, dass Sie die Schlüssel als Bitfolgen ohne jegliche Codierung verwenden.

Darüber hinaus ist es mit PBKDF2 nicht schwierig, sowohl Verschlüsselungs- als auch Authentifizierungsschlüssel aus einem einzigen Master-Passwort zu erhalten (verwenden Sie einfach eine kleine Anzahl von Iterationen oder sogar eine). Dies ist nützlich, wenn Sie nur ein „Master-Passwort“ haben, das sowohl für die Verschlüsselung als auch für die Authentifizierung verwendet wird.

Schlüsselspeicherung und -verwaltung

Am besten verwenden Sie ein separates dediziertes Schlüsselspeichergerät (HSM).

Wenn dies nicht möglich ist, kann man, um den Angriff zu erschweren, die Schlüsseldatei oder Konfigurationsdatei (in der die tatsächlichen Verschlüsselungs-/Authentifizierungsschlüssel gespeichert sind) mit einem Schlüssel verschlüsseln, der an einem separaten Ort (außerhalb des Home-Verzeichnisses oder des Site-Stammverzeichnisses) gespeichert ist. . Sie können beispielsweise eine Apache-Umgebungsvariable in httpd.conf verwenden, um den Schlüssel zu speichern, der zum Entschlüsseln der eigentlichen Schlüsseldatei erforderlich ist:
SetEnv keyfile_key crypto_strong_high_entropy_key # Sie können in PHP auf diese Variable zugreifen, indem Sie $_SERVER["keyfile_key"] # Rest der Konfiguration verwenden
Wenn nun Dateien im Stammverzeichnis der Site und darunter, einschließlich Dateien mit Schlüsseln, kompromittiert werden (z. B. wenn ein Backup durchgesickert ist), bleiben die verschlüsselten Daten sicher, da der in der Umgebungsvariablen gespeicherte Schlüssel nicht kompromittiert wurde. Es ist wichtig zu bedenken, dass httpd.conf-Dateien separat gesichert werden sollten und die Variable keyfile_key nicht beispielsweise durch die Ausgabe von phpinfo() gefährdet werden sollte.

Wenn Sie eine Datei anstelle eines Konfigurationsparameters verwenden, ist es möglich, die Schlüsselrotation zu organisieren. Im schlimmsten Fall, wenn ein Angreifer unbemerkt an Ihre Verschlüsselungs- und Authentifizierungsschlüssel gelangt ist, kann die Rotation der Schlüssel in bestimmten Abständen seinen Zugriff einschränken (vorausgesetzt, er kann keine neuen Schlüssel erhalten). Diese Technik trägt dazu bei, den Schaden zu reduzieren, da der Feind kompromittierte Schlüssel nicht unbegrenzt verwenden kann.

Datenkompression

Generell sollten Sie den Quelltext vor der Verschlüsselung nicht komprimieren. Dies kann dem Feind ein zusätzliches Analyseinstrument an die Hand geben.

Wenn Sie beispielsweise Sitzungsdaten in verschlüsselten Cookies speichern, von denen einige vom Benutzer bereitgestellt werden und andere geheime Informationen darstellen, kann ein Angreifer zusätzliche Informationen über das Geheimnis erfahren, indem er als normaler Benutzer einige speziell gestaltete Daten sendet Messen, wie sich die Länge der resultierenden Chiffretexte ändert.

Text wird effizienter komprimiert, wenn sich wiederholende Bereiche vorhanden sind. Durch die Manipulation von Benutzerdaten können Sie diese so auswählen, dass sie teilweise mit geheimen Daten übereinstimmen. Je größer die Übereinstimmung, desto kleiner ist der ausgegebene Chiffretext. Diese Art von Angriff wird als Kriminalität bezeichnet.

Wenn Sie die Daten nicht unbedingt komprimieren müssen, komprimieren Sie sie nicht.

Serverumgebung

Als allgemeine Regel gilt, dass Sie keine sicherheitsrelevanten Anwendungen auf einem gemeinsam genutzten Server hosten sollten. Zum Beispiel beim Shared Hosting, bei dem ein Angreifer auf eine virtuelle Maschine auf demselben physischen Server wie Sie zugreifen kann.

Es gibt verschiedene Gründe, die gemeinsam genutzte Server zu einem zweifelhaften Ort für das Hosten sicherheitskritischer Anwendungen machen. Beispielsweise wurden kürzlich Angriffe zwischen virtuellen Servern nachgewiesen: eprint.iacr.org/2014/248.pdf. Dies ist eine gute Erinnerung daran, dass Angriffstechniken sich nicht verschlechtern, sondern mit der Zeit verfeinert und verbessert werden. Solche Fallstricke müssen immer berücksichtigt werden.

Fachkundige Beratung

Zu guter Letzt sollten Sie einen Experten konsultieren, um Ihren Sicherheitscode zu überprüfen.

(PHP 4, PHP 5, PHP 7)

crypt – Einweg-String-Hashing

Warnung

Diese Funktion ist (noch) nicht binärsicher!

Beschreibung

Krypta (Zeichenfolge $str [, Zeichenfolge $salt]): Zeichenfolge

Krypta() gibt eine Hash-Zeichenfolge unter Verwendung des Standard-Unix-DES-basierten Algorithmus oder alternativer Algorithmen zurück, die möglicherweise auf dem System verfügbar sind.

Der Salt-Parameter ist optional. Jedoch, Krypta() Erstellt einen schwachen Hash ohne Salz. PHP 5.6 oder höher löst ohne diesen einen E_NOTICE-Fehler aus. Stellen Sie sicher, dass Sie für eine bessere Sicherheit ein ausreichend starkes Salz angeben.

passwort_hash() verwendet einen starken Hash, generiert ein starkes Salt und wendet automatisch die richtigen Runden an. passwort_hash() ist ein einfaches Krypta() Wrapper und kompatibel mit vorhandenen Passwort-Hashes. Gebrauch von passwort_hash() wird gefördert.

Einige Betriebssysteme unterstützen mehr als einen Hash-Typ. Tatsächlich wird manchmal der Standard-DES-basierte Algorithmus durch einen MD5-basierten Algorithmus ersetzt. Der Hash-Typ wird durch das Salt-Argument ausgelöst. Vor 5.3 ermittelte PHP die verfügbaren Algorithmen zur Installationszeit basierend auf crypt() des Systems. Wenn kein Salt bereitgestellt wird, generiert PHP automatisch entweder ein standardmäßiges zweistelliges (DES) Salt oder ein zwölfstelliges ( MD5), abhängig von der Verfügbarkeit von MD5 crypt(). PHP legt eine Konstante mit dem Namen fest CRYPT_SALT_LENGTH Dies gibt den längsten gültigen Salt an, den die verfügbaren Hashes zulassen.

Der Standard DES-basiert Krypta() gibt das Salt als die ersten beiden Zeichen der Ausgabe zurück. Außerdem werden nur die ersten acht Zeichen von str verwendet, sodass längere Zeichenfolgen, die mit denselben acht Zeichen beginnen, dasselbe Ergebnis generieren (wenn dasselbe Salt verwendet wird).

Auf Systemen, auf denen die Funktion crypt() mehrere Hash-Typen unterstützt, werden die folgenden Konstanten auf 0 oder 1 gesetzt, je nachdem, ob der angegebene Typ verfügbar ist:

  • CRYPT_STD_DES– Standard-DES-basierter Hash mit einem zweistelligen Salt aus dem Alphabet „./0-9A-Za-z“. Die Verwendung ungültiger Zeichen im Salt führt dazu, dass crypt() fehlschlägt.
  • CRYPT_EXT_DES- Erweiterter DES-basierter Hash. Das „Salt“ ist eine 9-stellige Zeichenfolge, die aus einem Unterstrich, gefolgt von 4 Bytes Iterationsanzahl und 4 Bytes Salt besteht. Diese werden als druckbare Zeichen codiert, 6 Bit pro Zeichen, das niedrigstwertige Zeichen zuerst. Die Werte 0 bis 63 werden als „./0-9A-Za-z“ kodiert. Die Verwendung ungültiger Zeichen im Salt führt dazu, dass crypt() fehlschlägt.
  • CRYPT_MD5- MD5-Hashing mit einem zwölfstelligen Salt, beginnend mit $1$
  • CRYPT_BLOWFISH- Blowfish-Hashing mit einem Salt wie folgt: „$2a$“, „$2x$“ oder „$2y$“, ein zweistelliger Kostenparameter „$“ und 22 Zeichen aus dem Alphabet „./0-9A- Za-z". Die Verwendung von Zeichen außerhalb dieses Bereichs im Salt führt dazu, dass crypt() eine Zeichenfolge der Länge Null zurückgibt. Der zweistellige Kostenparameter ist der Logarithmus zur Basis 2 der Iterationszahl für den zugrunde liegenden Blowfish-basierten Hashing-Algorithmus und muss im Bereich von 04 bis 31 liegen. Werte außerhalb dieses Bereichs führen zum Scheitern von crypt(). PHP-Versionen vor 5.3.7 unterstützen nur „$2a$“ als Salt-Präfix: PHP 5.3.7 führte die neuen Präfixe ein, um eine Sicherheitslücke in der Blowfish-Implementierung zu beheben. Ausführliche Informationen zum Sicherheitsupdate finden Sie unter. Zusammenfassend lässt sich sagen, dass Entwickler, die nur auf PHP 5.3.7 und höher abzielen, „$2y$“ anstelle von „$2a$“ verwenden sollten.
  • CRYPT_SHA256- SHA-256-Hash mit einem Salt aus 16 Zeichen und dem Präfix $5$. Wenn der Salt-String mit „rounds=
  • CRYPT_SHA512- SHA-512-Hash mit einem Salt aus 16 Zeichen und dem Präfix $6$. Wenn der Salt-String mit „rounds= $“, der numerische Wert von N, wird verwendet, um anzugeben, wie oft die Hashing-Schleife ausgeführt werden soll, ähnlich wie der Kostenparameter bei Blowfish. Die Standardanzahl der Runden beträgt 5000, es gibt ein Minimum von 1000 und ein Maximum von 999.999.999. Jede Auswahl von N außerhalb dieses Bereichs wird auf den nächsten Grenzwert gekürzt.

Ab PHP 5.3.0 enthält PHP eine eigene Implementierung und verwendet diese, wenn das System einen oder mehrere der Algorithmen nicht unterstützt.

Parameter

Die Zeichenfolge, die gehasht werden soll.

Vorsicht

Verwendung der CRYPT_BLOWFISH Algorithmus führt dazu, dass der str-Parameter auf eine maximale Länge von 72 Zeichen gekürzt wird.

Ein optionaler Salt-String, auf dem das Hashing basiert. Wenn nicht angegeben, wird das Verhalten durch die Algorithmusimplementierung definiert und kann zu unerwarteten Ergebnissen führen.

Rückgabewerte

Gibt die gehashte Zeichenfolge oder eine Zeichenfolge zurück, die kürzer als 13 Zeichen ist und bei einem Fehler garantiert vom Salt abweicht.

Warnung

Bei der Validierung von Passwörtern sollte eine String-Vergleichsfunktion verwendet werden, die nicht anfällig für Timing-Angriffe ist, um die Ausgabe von zu vergleichen Krypta() zum bisher bekannten Hash. Ab PHP 5.6 ist dies möglich hash_equals() für diesen Zweck.

Änderungsprotokoll

Ausführung Beschreibung
5.6.5 Wenn die Fehlerzeichenfolge „*0“ als Salt angegeben wird, wird aus Gründen der Konsistenz mit anderen Krypta-Implementierungen jetzt „*1“ zurückgegeben. Vor dieser Version gab PHP 5.6 fälschlicherweise einen DES-Hash zurück.
5.6.0 Löst die Sicherheitswarnung E_NOTICE aus, wenn Salt weggelassen wird.
5.5.21 Wenn die Fehlerzeichenfolge „*0“ als Salt angegeben wird, wird aus Gründen der Konsistenz mit anderen Krypta-Implementierungen jetzt „*1“ zurückgegeben. Vor dieser Version gab PHP 5.5 (und frühere Zweige) fälschlicherweise einen DES-Hash zurück.
5.3.7 Hinzugefügt 2x$ Und 2 Jahre $ Blowfish-Modi zur Abwehr potenzieller High-Bit-Angriffe.
5.3.2 SHA-256- und SHA-512-Verschlüsselung basierend auf der Implementierung von Ulrich Drepper hinzugefügt.
5.3.2 Das Blowfish-Verhalten bei ungültigen Runden wurde behoben, um die Zeichenfolge „Fehler“ („*0“ oder „*1“) zurückzugeben, anstatt auf DES zurückzugreifen.
5.3.0 PHP enthält jetzt eine eigene Implementierung für die Algorithmen MD5 crypt, Standard DES, Extended DES und die Blowfish und wird diese verwenden, wenn das System einen oder mehrere der Algorithmen nicht unterstützt.

Beispiele

Beispiel 1 Krypta() Beispiele

$hashed_password = crypt("meinpasswort"); // Das Salz automatisch generieren lassen

/* Sie sollten die gesamten Ergebnisse von crypt() als Salt für den Vergleich von a übergeben
Passwort, um Probleme zu vermeiden, wenn verschiedene Hashing-Algorithmen verwendet werden. (Als
Oben steht, dass standardmäßiges DES-basiertes Passwort-Hashing ein zweistelliges Salt verwendet.
aber MD5-basiertes Hashing verwendet 12.) */
if (hash_equals ($hashed_password, crypt ($user_input, $hashed_password))) (
echo „Passwort bestätigt!“ ;
}
?>

Beispiel #2 Verwendung Krypta() mit htpasswd

// Passwort festlegen
$password = "meinpasswort" ;

// Holen Sie sich den Hash und lassen Sie das Salt automatisch generieren
$hash = crypt($password);
?>

Beispiel #3 Verwendung Krypta() mit verschiedenen Hash-Typen

/* Diese Salze sind nur Beispiele und sollten nicht wörtlich in Ihrem Code verwendet werden.
Sie sollten für jedes Passwort einen eigenen, korrekt formatierten Salt generieren.
*/
if (CRYPT_STD_DES == 1 ) (
echo "Standard DES: " . Krypta („rasmuslerdorf“, „rl“) . "\N" ;
}

if (CRYPT_EXT_DES == 1 ) (
echo "Extended DES: " . Krypta ("rasmuslerdorf" , "_J9..rasm") . "\N" ;
}

if (CRYPT_MD5 == 1 ) (
echo "MD5: " . Krypta ("rasmuslerdorf" , "$1$rasmusle$" ) . "\N" ;
}

if (CRYPT_BLOWFISH == 1 ) (
echo "Blowfish: " . crypt("rasmuslerdorf" , „$2a$07$usesomesillystringforsalt$“). "\N" ;
}

if (CRYPT_SHA256 == 1 ) (
echo "SHA-256: " . crypt("rasmuslerdorf" , „$5$rounds=5000$usesomesillystringforsalt$“). "\N" ;
}

if (CRYPT_SHA512 == 1 ) (
echo "SHA-512: " . crypt("rasmuslerdorf" , „$6$rounds=5000$usesomesillystringforsalt$“). "\N" ;
}
?>

Alle Informationen können verschlüsselt oder entschlüsselt werden, auch mit PHP. Diese Sprache verfügt über viele Datenverschlüsselungsfunktionen, von einfach bis komplex.

Schauen wir uns die grundlegenden Verschlüsselungsmethoden an

base64- ermöglicht das Verschlüsseln und Entschlüsseln von Daten mithilfe des MIME-Base64-Algorithmus. Es verwendet keine Schlüssel und wird häufig zum Ausblenden von Links in PHP verwendet.

Beispiele:
//den Text verschlüsseln
$text = "Link";
echo base64_encode($text); //Erzeugt: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
//Entschlüsselung
echo base64_decode("PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==");
?>

Wie Sie sehen können, haben wir zuerst die Operation base64_encode verwendet und die Chiffre erhalten: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, und ersetzte es dann in base64_decode und erhielt den Link zurück.

md5- ermöglicht Ihnen, Daten einseitig zu hashen. Das heißt, im Gegensatz zu Base64 können Sie sie nicht mehr wieder entschlüsseln. MD5 wird häufig zum Speichern von Passwörtern in einer Datenbank verwendet. In letzter Zeit ist die verschlüsselte MD5-Kombination jedoch leicht in Entschlüsselungstabellen zu finden, die freundlicherweise von vielen Websites und Algorithmen bereitgestellt werden. Daher ist es zum Speichern von MD5-Passwörtern besser, Algorithmen durch Blowfish zu ersetzen.

Beispiel:

//den Text verschlüsseln
echo md5("combination");
?>

Schlüsselverschlüsselung

Und das letzte Beispiel für Verschlüsselung/Entschlüsselung, über das ich sprechen wollte, verwendet einen Schlüssel (als Passwort). Das heißt, Sie übergeben der Verschlüsselungsfunktion einen eindeutigen Schlüssel und der Code wird zusammen mit diesem verschlüsselt. Zum Entschlüsseln müssen Sie der Funktion den verschlüsselten Code und einen Schlüssel zur Verfügung stellen, den nur Sie kennen. Ein Beispiel für die Verwendung von Funktionen ganz unten im Code.

Funktion __encode($text, $key) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $enc_text; ) )
Funktion strToHex($string) (
$hex="";
für ($i=0; $i< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
return $hex; )
Funktion __decode($text, $key) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
if (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = substr(mdecrypt_generic($td, base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $decode_text; ) )
Funktion hexToStr($hex) (
$string="";
für ($i=0; $i< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
return $string; )

$str = "Brötchen, die verschlüsselt werden müssen!
Per Schlüssel";
$code = strToHex(__encode($str, "My#key-do-36-simvolov"));
echo „Verschlüsselter Code: „.$code.“
";

$str = __decode(hexToStr($code), "My#key-do-36-simvolov");
echo „Entschlüsselter Code: „.$str.“
";
?>

Sie können HTML-Inhalte verschlüsseln. Die Schlüssellänge darf maximal 36 Zeichen betragen.

Mit dieser Methode können einige Daten verschlüsselt und in einer TXT-Datei oder Datenbank abgelegt und durch Entschlüsselung mit einem Schlüssel empfangen werden.

Natürlich kann jeder Code entschlüsselt/gehackt werden und dies ist keine Ausnahme. Verwenden Sie daher starke Verschlüsselungsmethoden.

Eine der Grundwahrheiten der Kryptographie ist, dass Sie auf diesem Gebiet nichts erfinden sollten, es sei denn, Sie sind ein Profi. Dies ist zum Teil richtig, denn auf dem Gebiet der Informationstechnologie wurde seit langem alles Gute erfunden, gelitten und jahrzehntelang genutzt. Die andere Seite der Wahrheit ist, dass die Entwicklung eines bestimmten Wissensgebiets nur durch einen ständigen Zufluss neuer Ideen und origineller Lösungen erfolgt.

Aus offensichtlichen Gründen werden wir es nicht auf die Giganten der industriellen Kryptographie wie AES abgesehen haben, sondern uns sozusagen mit Blackjack und Freude in die eigene kryptografische Forschung stürzen.

Teils, weil es interessant ist, teils, weil Sie durch die Modellierung eines eigenen Modells und den Vergleich mit anerkannten Standards deutlich die Kontraste, wirksamen Lösungen und völligen Auslassungen erkennen und verstehen, was Sie anstreben können, um die Effizienz zu verbessern.

Aber genug Wasser schon.

Nehmen wir an, unsere Webanwendung ist in PHP geschrieben, benötigt eine reversible Verschlüsselung und wir glauben, dass wir unser eigenes Verschlüsselungssystem schreiben können.

Schreiben wir also unser eigenes reversibles Verschlüsselungssystem mit privaten und öffentlichen Schlüsseln, das die folgenden Merkmale eines mehr oder weniger sicheren kryptografischen Algorithmus aufweist:

  1. Das Vorhandensein von Rauschsymbolen in der endgültigen Chiffre.
  2. Informationen in jedem Sender-Ziel-Kanal werden mit einem privaten Schlüssel verschlüsselt und die Matching-Funktion ist für jeden Schlüssel einzigartig.
  3. Jede Nachricht erhält einen Digest-Code – einen eindeutigen Code, der eine Funktion des privaten Schlüssels und der Originalnachricht ist. Dies ist erforderlich, um die Eindeutigkeit der „Quellsymbol“-Matching-Funktion zu erreichen<=>codiertes Symbol“ nicht nur für den Kanal „Sender-Empfänger“, sondern auch für jede einzelne Nachricht.

    Selbst wenn wir uns also vorstellen, dass die Entsprechung von codierten und ursprünglichen Symbolen für eine bestimmte Nachricht durch den Einsatz kryptografischer Analysen, beispielsweise der Frequenzanalyse, bekannt geworden ist, ergeben sich daraus keine Präferenzen bei der Untersuchung einer anderen Nachricht.

  4. Um die Häufigkeitsanalyse zu komplizieren, kodieren wir jedes anfängliche Nachrichtensymbol mit zwei Chiffriersymbolen.
Also was ist passiert.

Tatsächlich können Sie das Endergebnis sehen

Die SymCoder-Klasse umfasst Verschlüsselungs- und Entschlüsselungsmethoden.

Die Verschlüsselung erfolgt durch die Methode code(), die die Originalnachricht als Eingabe verwendet.

Hier erstellt eine Nachricht aus der generierten Korrespondenztabelle in tab_coded eine verschlüsselte Nachricht, die an den Rändern und im Inneren mit Rauschsymbolen verdünnt ist.

Übrigens sind Rauschsymbole für jeden Sender-Ziel-Kanal eindeutig, da sie mithilfe des Kanalschlüssels generiert werden, für Nachrichten jedoch nicht eindeutig. Die für die Verschlüsselung in code_symbols verwendeten Symbole sind einige Satzzeichen und Symbole wie %, @ usw.

Für jedes codierte Symbol gibt es zwei Symbole aus code_symbols, aus offensichtlichen Gründen, weil es um ein Vielfaches weniger davon gibt als die codierten Symbole.

Die Korrespondenztabelle „create_tab_coded“ wird mithilfe einer Übersetzung des Nachrichtenschlüssel-Hashs in ein Array erstellt, wobei die Anzahl der Elemente der Anzahl der Elemente im Codesymbol-Array entspricht. Auch die Startposition beim Durchlaufen zweistelliger Codes ist immer unterschiedlich und hängt mit der Kanaltaste zusammen. Dadurch kann sichergestellt werden, dass der Algorithmus zum Durchlaufen codierter Symbole und zum Zuordnen von Codesymbolen zu ihnen immer (oder garantiert oft) unterschiedlich ist.

Beispielsweise sieht die „Hallo Welt“-Nachricht, wenn sie codiert ist, so aus:

Digest-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

Und hier ist die gleiche Nachricht, noch einmal verschlüsselt:

Digest-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

Es ist ersichtlich, dass der Digest derselben Nachricht derselbe ist, die Chiffre jedoch unterschiedlich wird – Rauschsymbole werden in einer willkürlichen Übereinstimmung und in einer willkürlichen Reihenfolge für jede neue Verschlüsselung hinzugefügt.

Nachrichten haben eine Redundanz, die mit zunehmender Nachrichtenmenge abnimmt, bis zu 10 % Rauschen (bei den kürzesten Nachrichten erreicht das Rauschen 90 % oder mehr Prozent), die Mindestlänge einer verschlüsselten Nachricht beträgt 116 Zeichen. Einer der Nachteile dieser Verschlüsselungsmethode besteht darin, dass verschlüsselte Nachrichten mindestens verdoppelt werden.

Die Dekodierung besteht aus einer Rückübersetzung der Form „Codesymbol“ – dem Originalsymbol mit ausgeschnittenem Rauschen aus der Nachricht. Was könnte der Schlüssel sein? Grundsätzlich jede Zeichenfolge, die für jedes Ziel-Empfänger-Paar eindeutig ist.

Wenn Sie beispielsweise einen Messenger mit Nachrichtenverschlüsselung erstellen, könnte die einfachste Version des privaten Schlüssels md5($user_id_1. $salt. $user_id_2) sein, dann ist der Schlüssel für jeden Nachrichtenkanal eindeutig.

Nehmen wir an, Sie müssen Daten zwischen zwei Servern austauschen. Um die Daten vor dem Abhören des Datenverkehrs zu schützen, werden die Daten verschlüsselt. Nun, zum Beispiel die Übertragung von Aktionen innerhalb eines Botnetzes. Dabei handelt es sich im Wesentlichen nicht um eine Verschlüsselung, sondern um eine sogenannte Kodierung. Zur Dekodierung dieses Codes werden bekannte Funktionen verwendet.

Als weiteres Beispiel für Pseudoverschlüsselung gebe ich ein Beispiel für die „Verschlüsselung“ von Passwörtern in der Datenbank eines CMS – dort werden Passwörter nicht in md5() oder verschlüsselt, sondern einfach über base64 codiert. Diese. Wenn die Datenbank geleakt wird, wird es für einen Hacker nicht schwierig sein, alle Passwörter mithilfe der integrierten PHP-Funktion base64_decode() zu entschlüsseln.

Wir müssen Daten übertragen, ohne befürchten zu müssen, dass jemand den Text abfangen und entschlüsseln kann. PHP verfügt über ein beliebtes Datenverschlüsselungspaket namens Mcrypt, das eine bidirektionale Verschlüsselung (d. h. die eigentliche Verschlüsselung und Entschlüsselung von Daten) bietet.

Mcrypt Version 2.4.7 unterstützt die folgenden symmetrischen Verschlüsselungsalgorithmen: Blowfish, RC2, Safer-sk64 xtea, Cast-256, RC4, Safer-sk128, DES, RC4-iv, Serpent, Enigma, Rijndael-128, Threeway, Rijndael-192 , TripleDES, LOKI97, Rijndael-256, Twofish, Panama, Saferplus usw. Weitere Details zu jedem Algorithmus finden Sie auf Wikipedia.

Da symmetrische Verschlüsselung zum Einsatz kommt, muss der Schlüssel beiden Parteien bekannt sein und geheim gehalten werden.

Beispiel für die Verschlüsselung und Entschlüsselung einer Zeichenfolge

mcrypt_module_open("des", "", "ecb", "")
Diese Funktion öffnet das Algorithmusmodul und den verwendeten Modus. In diesem Beispiel befindet sich der DES-Algorithmus im ECB-Modus.

$key = substr($key, 0, mcrypt_enc_get_key_size($td));
Die maximale Schlüsselgröße muss durch Aufrufen der Funktion mcrypt_enc_get_key_size() ermittelt werden, und jeder Wert, der kleiner als dieser Wert ist, ist korrekt.

$s = mcrypt_generic($td, $source);
Beim Verschlüsseln werden die Daten mit null Bytes aufgefüllt, um sicherzustellen, dass die Daten eine Länge von n*Blockgrößen haben. Die Blockgröße wird durch den Algorithmus bestimmt (für DES beträgt die Blockgröße 64 Bit). Daher kann beim Entschlüsseln am Ende der Zeile „\0“ erscheinen, das durch die Funktion trim() entfernt wird