Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

LIBSODIUM mendekripsi data di dalam kueri mysql seperti yang dilakukan dengan AES_DECRYPT

Libsodium tidak terpasang di MySQL, jadi Anda tidak bisa hanya memanggil sesuatu yang setara dengan AES_ENCRYPT() dari dalam kueri MySQL dan dapatkan hasil yang Anda harapkan.

Namun, pendekatan alternatif adalah dengan menggunakan perpustakaan seperti CipherSweet , yang menyediakan enkripsi terotentikasi yang dapat dicari. Pastikan Anda memahami fiturnya dan batasan sebelum memutuskan untuk menggunakannya.

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

Anda harus melihat sesuatu yang mirip dengan ini. Nilai dalam [0] akan berubah, tetapi nilai dalam [1] tidak akan. Ini karena [0] berisi data baris dengan (beberapa bidang dienkripsi). [1] hanya berisi indeks buta (dapat digunakan nanti dalam kueri 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"
    }
  }
}

Perhatikan bahwa bidang floating point akan selalu menghasilkan output dengan panjang tetap, bahkan jika input memiliki tingkat presisi yang bervariasi. Ini dilakukan dengan sengaja untuk mencegah penyerang mempelajari informasi dari panjang ciphertext.

Jika Anda memilih ModernCrypto bukannya FIPSCrypto , semua hal di atas akan dilakukan dengan libsodium. Enkripsi persis yang digunakan oleh masing-masing didokumentasikan di sini , jika ada yang penasaran.

Perhatikan bahwa Anda harus menghitung sendiri nilai yang didekripsi dalam PHP daripada SQL.

Lagi pula, inti dari mengenkripsi data sebelum menyimpannya dalam database adalah menyembunyikannya dari server database (dan setiap penyerang yang dapat membahayakan server tersebut).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggabungkan kueri SELECT + WHERE dengan kueri INSERT?

  2. MySQL Query mendapatkan N baris terakhir per Grup

  3. MySql Query- Rentang Tanggal dalam Rentang Tanggal

  4. PHP, MySQL:Terima email, pencarian otomatis di DB &kirim email berdasarkan hasil

  5. SQL - Perbarui banyak catatan dalam satu kueri