Heim >Backend-Entwicklung >PHP-Tutorial >PHP-Sicherheitsverschlüsselungstechnologie

PHP-Sicherheitsverschlüsselungstechnologie

伊谢尔伦
伊谢尔伦Original
2016-11-21 16:11:571045Durchsuche

Ein PHP-Entwickler sollte vor allem mit den folgenden Verschlüsselungsmethoden vertraut sein:

l Symmetrische Verschlüsselung

l Asymmetrische Verschlüsselung (öffentlicher Schlüssel)

l Hash-Funktion (Informationszusammenfassung)

l Informationsüberprüfungscode

Dieser Anhang konzentriert sich hauptsächlich auf den symmetrischen Verschlüsselungsalgorithmus unter Verwendung der mcrypt-Erweiterung. Die Informationen, auf die Sie sich beziehen müssen, lauten wie folgt:

Applied Cryptography, von Bruce Schneier (Wiley)

http://www.schneier.com/blog /

http://wikipedia.org/wiki/Cryptography

http://phpsec.org/articles/2005/password-hashing.html

http:/ / pear.php.net/package/Crypt_HMAC

http://pear.php.net/package/Crypt_RSA

C.1. Passwortspeicherung

Wenn Sie Passwörter in einer Datenbank speichern, speichern Sie sie niemals im Klartext. Speichern Sie stattdessen den Hashwert des Passworts und verwenden Sie gleichzeitig zusätzliche Zeichenfolgen:

<?php
 
  /* $password contains the password. */
 
  $salt = &#39;SHIFLETT&#39;;
  $password_hash = md5($salt . md5($password . $salt));
 
  /* Store password hash. */
 
  ?>

Wenn Sie bestätigen müssen, ob ein Passwort korrekt ist, berechnen Sie den Hash-Wert auf die gleiche Weise und vergleichen Sie die Ähnlichkeiten und Unterschiede:

<?php
 
  $salt = &#39;SHIFLETT&#39;;
  $password_hash = md5($salt . md5($_POST[&#39;password&#39;] . $salt));
 
  /* Compare password hashes. */
 
  ?>

Wenn der Hash Wenn die Werte genau gleich sind, haben Sie Grund zu der Annahme, dass auch das Passwort dasselbe ist.

Wenn dieser Trick angewendet wird, ist es unmöglich, dem Benutzer sein Passwort mitzuteilen. Wenn ein Benutzer sein Passwort vergisst, können Sie ihn nur bitten, ein neues Passwort einzugeben und den Hash-Wert neu zu berechnen und in der Datenbank zu speichern. Natürlich müssen Sie bei der Authentifizierung von Benutzern sehr vorsichtig sein – Passwort-Erinnerungen sind ein häufiges Ziel von Angriffen und eine häufige Quelle von Sicherheitsverletzungen.

C.2. Verwendung von mcrypt

Die Standard-Verschlüsselungserweiterung von PHP ist mcrypt, die viele verschiedene Verschlüsselungsalgorithmen unterstützt. Sie können die Liste der auf Ihrer Plattform unterstützten Algorithmen über die Funktion mcrypt_list_algorithms() anzeigen:

<?php
 
  echo &#39;<pre class="brush:php;toolbar:false">&#39; . print_r(mcrypt_list_algorithms(), TRUE) . &#39;
'; ?>

Ver- und Entschlüsselung werden durch mcrypt_encrypt() und mcrypt_decrypt() durchgeführt. Funktionen bzw. erfüllen. Beide Funktionen verfügen über 5 Parameter. Der erste Parameter wird verwendet, um den verwendeten Algorithmus anzugeben:

 <?php
 
  mcrypt_encrypt($algorithm,
                 $key,
                 $cleartext,
                 $mode,
                 $iv);
 
  mcrypt_decrypt($algorithm,
                 $key,
                 $ciphertext,
                 $mode,
                 $iv);
 
  ?>

Der Verschlüsselungsschlüssel (der zweite Parameter) ist eine sehr sensible Datenquelle, die Sie erstellen möchten Stellen Sie sicher, dass Sie es an einem sicheren Ort aufbewahren. Verschlüsselungsschlüssel können mit den Methoden zum Schutz von Datenbankberechtigungen in Kapitel 8 geschützt werden. Wenn die finanziellen Bedingungen es zulassen, sind Hardware-Verschlüsselungsschlüssel die beste Wahl, da sie äußerst hohe Sicherheit bieten.

Die Funktion verfügt über mehrere Modi zur Auswahl. Sie können mcrypt_list_modes() verwenden, um alle unterstützten Modi aufzulisten:

<?php
 
  echo &#39;<pre class="brush:php;toolbar:false">&#39; . print_r(mcrypt_list_modes(), TRUE) . &#39;
'; ?>

Der fünfte Parameter ($ iv) ist der Initialisierungsvektor, der mit der Funktion mcrypt_create_iv() erstellt werden kann.

Die folgende Beispielklasse stellt grundlegende Verschlüsselungs- und Entschlüsselungsmethoden bereit:

class crypt
  {
    private $algorithm;
    private $mode;
    private $random_source;
 
    public $cleartext;
    public $ciphertext;
    public $iv;
 
    public function __construct($algorithm = MCRYPT_BLOWFISH,
                                $mode = MCRYPT_MODE_CBC,
                                $random_source = MCRYPT_DEV_URANDOM)
    {
      $this->algorithm = $algorithm;
      $this->mode = $mode;
      $this->random_source = $random_source;
    }
 
    public function generate_iv()
    {
      $this->iv = mcrypt_create_iv(mcrypt_get_iv_size($this->algorithm,
        $this->mode), $this->random_source);
    }
 
    public function encrypt()
    {
      $this->ciphertext = mcrypt_encrypt($this->algorithm,
        $_SERVER[&#39;CRYPT_KEY&#39;], $this->cleartext, $this->mode, $this->iv);
    }
 
    public function decrypt()
    {
      $this->cleartext = mcrypt_decrypt($this->algorithm,
        $_SERVER[&#39;CRYPT_KEY&#39;], $this->ciphertext, $this->mode, $this->iv);
    }
  }
 
  ?>

Die obige Klasse wird in anderen Beispielen verwendet. Das Folgende ist ein Beispiel für ihre Verwendung :

<?php
 
  $crypt = new crypt();
 
  $crypt->cleartext = &#39;This is a string&#39;;
  $crypt->generate_iv();
  $crypt->encrypt();
 
  $ciphertext = base64_encode($crypt->ciphertext);
  $iv = base64_encode($crypt->iv);
 
  unset($crypt);
 
  /* Store $ciphertext and $iv (initialization vector). */
 
  $ciphertext = base64_decode($ciphertext);
  $iv = base64_decode($iv);
 
  $crypt = new crypt();
 
  $crypt->iv = $iv;
  $crypt->ciphertext = $ciphertext;
  $crypt->decrypt();
 
  $cleartext = $crypt->cleartext;
?>

Tipps

Diese Erweiterung erfordert die Verwendung des Flags -mcrypt beim Kompilieren von PHP. Installationsanweisungen und Anforderungen finden Sie unter http://php.net/mcrypt.

C.3. Speicherung von Kreditkartennummern

Ich werde oft gefragt, wie ich Kreditkartennummern sicher speichern kann. Meiner beginnt immer mit der Frage, ob die Kreditkartennummer wirklich gespeichert werden muss. Denn egal wie man es macht, es ist unklug, unnötige Risiken einzugehen. Gleichzeitig gibt es in den nationalen Gesetzen auch Regelungen zur Verarbeitung von Kreditkarteninformationen. Ich erinnere mich immer daran, dass ich kein Rechtsexperte bin.

In diesem Buch werde ich nicht speziell auf Kreditkartenverarbeitungsmethoden eingehen, sondern erklären, wie verschlüsselte Informationen in der Datenbank gespeichert und beim Lesen entschlüsselt werden. Dieser Prozess führt zu einer Verschlechterung der Systemleistung, bietet jedoch eine Schutzschicht. Der Hauptvorteil besteht darin, dass im Falle eines Lecks des Datenbankinhalts nur die verschlüsselten Informationen offengelegt werden. Voraussetzung ist jedoch, dass der Verschlüsselungsschlüssel sicher ist. Daher ist der Verschlüsselungsschlüssel genauso wichtig wie die Implementierung der Verschlüsselung selbst.

Der Prozess des Speicherns verschlüsselter Daten in Daten besteht darin, zunächst die Daten zu verschlüsseln, dann Chiffretext über den ursprünglichen Vektor und Klartext zu erstellen und ihn in der Datenbank zu speichern. Da es sich bei dem Chiffretext um eine Binärzeichenfolge handelt, muss er über base64_encode() in eine normale Textzeichenfolge konvertiert werden, um eine sichere Speicherung der Binärcodierung zu gewährleisten.

  <?php
 
  $crypt = new crypt();
 
  $crypt->cleartext = &#39;1234567890123456&#39;;
  $crypt->generate_iv();
  $crypt->encrypt();
 
  $ciphertext = $crypt->ciphertext;
  $iv = $crypt->iv;
 
  $string = base64_encode($iv . $ciphertext);
 
  ?>

Speichern Sie die Zeichenfolge in der Datenbank. Beim Lesen handelt es sich um die umgekehrte Verarbeitung des obigen Prozesses:

 <?php
 
  $string = base64_decode($string);
 
  $iv_size = mcrypt_get_iv_size($algorithm, $mode);
 
  $ciphertext = substr($string, $iv_size);
  $iv = substr($string, 0, $iv_size);
 
  $crypt = new crypt();
 
  $crypt->iv = $iv;
  $crypt->ciphertext = $ciphertext;
  $crypt->decrypt();
 
  $cleartext =  $crypt->cleartext;
 
  ?>

Bei dieser Implementierungsmethode wird davon ausgegangen, dass der Verschlüsselungsalgorithmus und -modus unverändert bleiben. Wenn sie nicht definiert sind, müssen Sie sie auch speichern, um sie beim Entschlüsseln der Daten verwenden zu können. Der Verschlüsselungsschlüssel ist die einzige Information, die geheim gehalten werden muss.

C.4. Sitzungsdaten verschlüsseln

  如果你的数据库存在安全问题,或者部分保存在会话中的数据是敏感的,你可能希望加密会话数据。除非很有必要,一般我不推荐这样做,但是如果你觉得在你的情形下需要这样做的话,本节提供了一个实现方法的示例。

  这个方案十分简单。实际上,在第八章中,已经说明了如何通过调用session_set_save_handler( )来执行你自己的会话机制。通过对保存和读取数据的函数的少量调整,你就能加密存入数据库的数据及在读取时解密数据:

  <?php
 
  function _read($id)
  {
    global $_sess_db;
 
    $algorithm = MCRYPT_BLOWFISH;
    $mode = MCRYPT_MODE_CBC;
 
    $id = mysql_real_escape_string($id);
 
    $sql = "SELECT data
            FROM   sessions
            WHERE  id = &#39;$id&#39;";
 
    if ($result = mysql_query($sql, $_sess_db))
    {
        $record = mysql_fetch_assoc($result);
 
        $data = base64_decode($record[&#39;data&#39;]);
 
        $iv_size = mcrypt_get_iv_size($algorithm, $mode);
 
        $ciphertext = substr($data, $iv_size);
        $iv = substr($data, 0, $iv_size);
 
        $crypt = new crypt();
 
        $crypt->iv = $iv;
        $crypt->ciphertext = $ciphertext;
        $crypt->decrypt();
 
        return $crypt->cleartext;
    }
 
    return &#39;&#39;;
  }
 
  function _write($id, $data)
  {
    global $_sess_db;
 
    $access = time();
 
    $crypt = new crypt();
 
    $crypt->cleartext = $data;
    $crypt->generate_iv();
    $crypt->encrypt();
 
    $ciphertext = $crypt->ciphertext;
    $iv = $crypt->iv;
 
    $data = base64_encode($iv . $ciphertext);
 
    $id = mysql_real_escape_string($id);
    $access = mysql_real_escape_string($access);
    $data = mysql_real_escape_string($data);
 
    $sql = "REPLACE
            INTO    sessions
            VALUES  (&#39;$id&#39;, &#39;$access&#39;, &#39;$data&#39;)";
 
    return mysql_query($sql, $_sess_db);
  }
  ?>


Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn