sql >> Databasteknik >  >> RDS >> Mysql

LIBSODIUM dekryptera data inuti mysql-frågan som gjorde med AES_DECRYPT

Libsodium är inte inbyggt i MySQL, så du kan inte bara kalla något som motsvarar AES_ENCRYPT() från en MySQL-fråga och få de resultat du förväntar dig.

Ett alternativt tillvägagångssätt är dock att använda ett bibliotek som CipherSweet , som tillhandahåller sökbar autentiserad kryptering. Se till att du förstår dess funktioner och begränsningar innan du bestämmer dig för att använda den.

<?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);

Du borde se något liknande detta. Värdena i [0] kommer att ändras, men värdena i [1] ska inte. Detta beror på att [0] innehåller raddata med (vissa fält krypterade). [1] innehåller endast blinda index (kan användas senare i SELECT-frågor).

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"
    }
  }
}

Observera att flyttalsfälten alltid kommer att producera en utdata med fast längd, även om ingångarna har varierande precisionsnivåer. Detta görs avsiktligt för att förhindra angripare från att lära sig information från chiffertextlängd.

Om du väljer ModernCrypto istället för FIPSCrypto , kommer allt ovan att göras med libsodium. Den exakta krypteringen som används av var och en är dokumenterad här , om någon är nyfiken.

Observera att du måste göra dina egna beräkningar av de dekrypterade värdena i PHP snarare än SQL.

När allt kommer omkring är hela poängen med att kryptera data innan den lagras i en databas att dölja den från databasservern (och alla angripare som kunde ha äventyrat nämnda server).




  1. mysql - Skapa rader kontra kolumnprestanda

  2. Så här löser du Anrop till odefinierad funktion dbase_open()-fel i Windows

  3. Olaglig blandning av sammanställningar i mySQL

  4. Varför fungerar inte sqlalchemys standardkolumnvärde