sql >> Databáze >  >> RDS >> Mysql

LIBSODIUM dešifruje data uvnitř dotazu mysql jako u AES_DECRYPT

Libsodium není zabudováno do MySQL, takže nemůžete jen tak zavolat něco ekvivalentního AES_ENCRYPT() z dotazu MySQL a získejte očekávané výsledky.

Alternativním přístupem je však použití knihovny jako CipherSweet , který poskytuje prohledávatelné ověřené šifrování. Ujistěte se, že rozumíte jeho funkcím a omezení než se rozhodnete jej použít.

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

Měli byste vidět něco podobného. Hodnoty v [0] se změní, ale hodnoty v [1] nebude. Je to proto, že [0] obsahuje data řádku s (některá pole zašifrována). [1] obsahuje pouze slepé indexy (použitelné později v dotazech SELECT).

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

Všimněte si, že pole s pohyblivou řádovou čárkou vždy vytvoří výstup s pevnou délkou, i když vstupy mají různé úrovně přesnosti. To se děje záměrně, aby se útočníkům zabránilo učit se informace z délky šifrovaného textu.

Pokud vyberete ModernCrypto místo FIPSCrypto , vše výše uvedené bude provedeno pomocí libsodium. Přesné šifrování používané každým z nich je zdokumentováno zde , kdyby to někoho zajímalo.

Všimněte si, že budete muset provést vlastní výpočty dešifrovaných hodnot v PHP, nikoli SQL.

Koneckonců, celý smysl šifrování dat před jejich uložením do databáze je skrýt je před databázovým serverem (a před všemi útočníky, kteří by mohli uvedený server kompromitovat).




  1. Připojení k serveru Azure MySQL se nezdaří kvůli nesprávnému připojovacímu řetězci

  2. Nejlepší způsob, jak uložit čas posledního dotyku v Cassandře

  3. Jak připojit databázi mySQL pomocí C++

  4. Jak získat nové uživatele za den v MySQL