Mysql
 sql >> база данни >  >> RDS >> Mysql

LIBSODIUM декриптира данни в mysql заявка, както направи с AES_DECRYPT

Libsodium не е вграден в MySQL, така че не можете просто да извикате нещо еквивалентно на AES_ENCRYPT() от MySQL заявка и получете резултатите, които очаквате.

Въпреки това, алтернативен подход е да се използва библиотека като CipherSweet , който осигурява удостоверено криптиране с възможност за търсене. Уверете се, че разбирате функциите му и ограничения преди да решите да го използвате.

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

Трябва да видите нещо подобно на това. Стойностите в [0] ще се промени, но стойностите в [1] няма да. Това е така, защото [0] съдържа данните за реда с (някои полета са криптирани). [1] съдържа само слепи индекси (използваеми по-късно в 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"
    }
  }
}

Имайте предвид, че полетата с плаваща запетая винаги ще произвеждат изход с фиксирана дължина, дори ако входовете имат различни нива на точност. Това се прави умишлено, за да се попречи на нападателите да научат информация от дължината на шифрования текст.

Ако изберете ModernCrypto вместо FIPSCrypto , всичко по-горе ще бъде направено с libsodium. Точното криптиране, използвано от всеки, е документирано тук , ако някой е любопитен.

Имайте предвид, че ще трябва да направите свои собствени изчисления на декриптираните стойности в PHP, а не в SQL.

В края на краищата, целият смисъл на криптирането на данни преди съхраняването им в база данни е да ги скриете от сървъра на базата данни (и всички нападатели, които биха могли да компрометират сървъра).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да регистрирам ръчно нестандартизирани SQL функции в приложението Spring Boot?

  2. Вземете всички потребители с изключение на текущия влязъл потребител в laravel eloquent

  3. PHP скриптът за всеки потребител изглежда кара apache да виси

  4. Функция MySQL DEGREES() – Преобразуване от радиани в градуси

  5. получаване на db:SQLSTATE[HY000] [2002] Грешка отказана връзка на Mac с MAMP