Libsodium is niet ingebouwd in MySQL, dus je kunt niet zomaar iets aanroepen dat gelijk is aan AES_ENCRYPT()
vanuit een MySQL-query en krijgt u de resultaten die u verwacht.
Een alternatieve benadering is echter om een bibliotheek te gebruiken zoals CipherSweet , die doorzoekbare geverifieerde codering biedt. Zorg ervoor dat u zijn functies begrijpt en beperkingen voordat u besluit het te gebruiken.
<?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);
Je zou iets vergelijkbaars moeten zien. De waarden in de [0]
zal veranderen, maar de waarden in [1]
zal niet. Dit komt omdat [0]
bevat de rijgegevens met (sommige velden versleuteld). [1]
bevat alleen blinde indexen (later bruikbaar in SELECT-query's).
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"
}
}
}
Merk op dat de drijvende-kommavelden altijd een uitvoer met een vaste lengte zullen produceren, zelfs als de invoer verschillende nauwkeurigheidsniveaus heeft. Dit is opzettelijk gedaan om te voorkomen dat aanvallers informatie leren van de lengte van de cijfertekst.
Als u ModernCrypto
selecteert in plaats van FIPSCrypto
, zal al het bovenstaande worden gedaan met libsodium. De exacte codering die door elk wordt gebruikt, is hier gedocumenteerd
, als iemand nieuwsgierig is.
Houd er rekening mee dat u uw eigen berekeningen van de gedecodeerde waarden in PHP moet doen in plaats van SQL.
Het hele punt van het versleutelen van gegevens voordat ze in een database worden opgeslagen, is om ze te verbergen voor de databaseserver (en eventuele aanvallers die de server zouden hebben gecompromitteerd).