Mysql
 sql >> Datenbank >  >> RDS >> Mysql

LIBSODIUM entschlüsselt Daten in einer MySQL-Abfrage wie bei AES_DECRYPT

Libsodium ist nicht in MySQL integriert, daher können Sie nicht einfach etwas Äquivalentes zu AES_ENCRYPT() aufrufen aus einer MySQL-Abfrage heraus und erhalten Sie die erwarteten Ergebnisse.

Ein alternativer Ansatz ist jedoch die Verwendung einer Bibliothek wie CipherSweet , das eine durchsuchbare authentifizierte Verschlüsselung bereitstellt. Stellen Sie sicher, dass Sie seine Funktionen verstehen und Einschränkungen bevor Sie sich entscheiden, es zu verwenden.

<?php
use ParagonIE\CipherSweet\CipherSweet;
use ParagonIE\CipherSweet\EncryptedRow;
use ParagonIE\CipherSweet\Transformation\AlphaCharactersOnly;
use ParagonIE\CipherSweet\Transformation\FirstCharacter;
use ParagonIE\CipherSweet\Transformation\Lowercase;
use ParagonIE\CipherSweet\Backend\FIPSCrypto;
use ParagonIE\CipherSweet\KeyProvider\StringProvider;

$provider = new StringProvider(
    // Example key, chosen randomly, hex-encoded:
    'a981d3894b5884f6965baea64a09bb5b4b59c10e857008fc814923cf2f2de558'
);
$engine = new CipherSweet($provider, new FIPSCrypto());

/** @var CipherSweet $engine */
$row = (new EncryptedRow($engine, 'contacts'))
    ->addTextField('first_name')
    ->addTextField('last_name')
    ->addFloatField('latitude')
    ->addFloatField('longitude');

// Notice the ->addRowTransform() method:
$row->addCompoundIndex(
    $row->createCompoundIndex(
        'contact_first_init_last_name',
        ['first_name', 'last_name'],
        64, // 64 bits = 8 bytes
        true
    )
        ->addTransform('first_name', new AlphaCharactersOnly())
        ->addTransform('first_name', new Lowercase())
        ->addTransform('first_name', new FirstCharacter())
        ->addTransform('last_name', new AlphaCharactersOnly())
        ->addTransform('last_name', new Lowercase())
);

$prepared = $row->prepareRowForStorage([
    'first_name' => 'Jane',
    'last_name' => 'Doe',
    'latitude' => 52.52,
    'longitude' => -33.106,
    'extraneous' => true
]);

var_dump($prepared);

Sie sollten etwas Ähnliches sehen. Die Werte in [0][code> wird sich ändern, aber die Werte in [1] wird nicht. Dies liegt daran, [0][code> enthält die Zeilendaten mit (einige Felder verschlüsselt). [1][code> enthält nur blinde Indizes (später verwendbar in SELECT-Abfragen).

array(2) {
  [0]=>
  array(5) {
    ["first_name"]=>
    string(141) "fips:nrtzoaxvPIOA7jPskWVwJmC0q8WJqrsnqjPh3ifNPsRd2TAx6OwTDfSiMVCXSsSRNQb_nxJlW7TbAtf5UvQRWWKTGhk_kXxpZKdnTrpjbmxi0IgstSrZ126Qz6E0_lvjew0Ygw=="
    ["last_name"]=>
    string(137) "fips:98f5CLB24w0zSqCGPR0D2oq9wQvUwzxo_byAp6mKgMgoJkUHZX1oTtk4Cm8FXI7fsUI8HOG5sKQFGRn6cXMw1EOMGgpXZqiXEDb3jxEbg9s95d4g2NeVd4xs2tmX0xlZ0nSM"
    ["latitude"]=>
    string(145) "fips:d3TVGfnRFlvWxbfihgHqjpXlXU3HtkCAHzM0-4f1l5dAeQf2Vk5RDDVOGMQNM09r0O4UOAub6QTyHGezQ0bWKQ5omqoYCTBJE0Uf_2DSPfO7U4dG74phaP04iFgqpJ8G41q54Kv5t54="
    ["longitude"]=>
    string(145) "fips:IcnUnBZZOxJPYXk-F3v12O_krNb9JsexljiV4gJzgctTpxLFm7ql0tJRF7xP3wLrUtd1VyfYBf75ot7iOSIIIFqsuyKZQdI9UyKbqd87RTMsHbHgPouxgZBg1urlqpuWqbOYEFGiti4="
    ["extraneous"]=>
    bool(true)
  }
  [1]=>
  array(1) {
    ["contact_first_init_last_name"]=>
    array(2) {
      ["type"]=>
      string(13) "w6dsrxbathjze"
      ["value"]=>
      string(16) "546b1ffd1f83c37a"
    }
  }
}

Beachten Sie, dass die Gleitkommafelder immer eine Ausgabe mit fester Länge erzeugen, selbst wenn die Eingaben unterschiedliche Genauigkeitsgrade aufweisen. Dies geschieht absichtlich, um zu verhindern, dass Angreifer Informationen aus der Chiffretextlänge lernen.

Wenn Sie ModernCrypto auswählen statt FIPSCrypto , werden alle oben genannten Schritte mit libsodium durchgeführt. Die genaue Verschlüsselung, die von jedem verwendet wird, ist hier dokumentiert , falls jemand neugierig ist.

Beachten Sie, dass Sie Ihre eigenen Berechnungen der entschlüsselten Werte in PHP statt in SQL durchführen müssen.

Schließlich besteht der Sinn der Verschlüsselung von Daten vor dem Speichern in einer Datenbank darin, sie vor dem Datenbankserver (und allen Angreifern, die diesen Server hätten kompromittieren können) zu verbergen.