Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

LIBSODIUM giải mã dữ liệu bên trong truy vấn mysql như đã làm với AES_DECRYPT

Libsodium không được tích hợp vào MySQL, vì vậy bạn không thể chỉ gọi một cái gì đó tương đương với AES_ENCRYPT() từ bên trong truy vấn MySQL và nhận được kết quả bạn mong đợi.

Tuy nhiên, một phương pháp thay thế là sử dụng thư viện như CipherSweet , cung cấp mã hóa đã xác thực có thể tìm kiếm. Đảm bảo rằng bạn hiểu các tính năng của nó giới hạn trước khi quyết định sử dụng nó.

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

Bạn sẽ thấy một cái gì đó tương tự như thế này. Các giá trị trong [0] sẽ thay đổi, nhưng các giá trị trong [1] sẽ không. Đây là becuase [0] chứa dữ liệu hàng với (một số trường được mã hóa). [1] chỉ chứa các chỉ mục mù (có thể sử dụng sau này trong các truy vấn CHỌN).

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

Lưu ý rằng các trường dấu phẩy động sẽ luôn tạo ra đầu ra có độ dài cố định, ngay cả khi các đầu vào có mức độ chính xác khác nhau. Điều này được thực hiện có chủ đích để ngăn những kẻ tấn công tìm hiểu thông tin từ độ dài bản mã.

Nếu bạn chọn ModernCrypto thay vì FIPSCrypto , tất cả những điều trên sẽ được thực hiện với libsodium. Mã hóa chính xác từng được sử dụng là được ghi lại tại đây , nếu có ai tò mò.

Lưu ý rằng bạn sẽ phải thực hiện các phép tính của riêng mình về các giá trị được giải mã trong PHP thay vì SQL.

Rốt cuộc, toàn bộ điểm của việc mã hóa dữ liệu trước khi lưu trữ trong cơ sở dữ liệu là ẩn nó khỏi máy chủ cơ sở dữ liệu (và bất kỳ kẻ tấn công nào có thể đã xâm nhập máy chủ đó).




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để chèn các tệp lớn trong MySQL db bằng PHP?

  2. Loại MySQL ENUM so với các bảng tham gia

  3. Làm thế nào để tạo một menu lồng nhau từ MySQL với PHP?

  4. Làm cách nào để lấy id giao dịch cơ sở dữ liệu hiện tại bằng JDBC hoặc Hibernate?

  5. Kích thước trường ký tự lớn trong SAS