sql >> Database teknologi >  >> RDS >> Mysql

LIBSODIUM dekrypterer data inde i mysql-forespørgslen ligesom med AES_DECRYPT

Libsodium er ikke indbygget i MySQL, så du kan ikke bare kalde noget, der svarer til AES_ENCRYPT() fra en MySQL-forespørgsel og få de resultater, du forventer.

En alternativ tilgang er dog at bruge et bibliotek som CipherSweet , som giver søgbar autentificeret kryptering. Sørg for, at du forstår dens funktioner og begrænsninger før du beslutter dig for at bruge det.

<?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 burde se noget lignende dette. Værdierne i [0] vil ændre sig, men værdierne i [1] vil ikke. Dette er fordi [0] indeholder rækkedata med (nogle felter krypteret). [1] indeholder kun blinde indekser (kan bruges senere i SELECT-forespørgsler).

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

Bemærk, at felterne med flydende komma altid vil producere et output med fast længde, selvom inputs har varierende præcisionsniveauer. Dette gøres med vilje for at forhindre angribere i at lære information fra chiffertekstlængde.

Hvis du vælger ModernCrypto i stedet for FIPSCrypto , vil alt ovenstående blive udført med libsodium. Den nøjagtige kryptering, der bruges af hver er dokumenteret her , hvis nogen er nysgerrige.

Bemærk, at du skal lave dine egne beregninger af de dekrypterede værdier i PHP i stedet for SQL.

Når alt kommer til alt, er hele pointen med at kryptere data, før de lagres i en database, at skjule dem fra databaseserveren (og eventuelle angribere, der kunne have kompromitteret serveren).




  1. Genialt SQL Password Changer Utility til at nulstille SQL Password

  2. mysql gendan til en anden database

  3. Hvorfor henter jeg denne fejl migreringsdata fra SQL Lite til Posgres DB? dubletnøgleværdi overtræder unik begrænsning

  4. MySQL - Referencer til aggregeret kolonne i where-sætning