Php libnaud在mysql查询中解密数据,就像使用AES_decrypt一样

Php libnaud在mysql查询中解密数据,就像使用AES_decrypt一样,php,mysql,security,encryption,libsodium,Php,Mysql,Security,Encryption,Libsodium,我有一些sql查询,我在其中选择靠近用户位置的行。 使用AES_DECRYPT,我可以在查询中执行以下操作: AES_DECRYPT(lat, :key) 我需要查询中的解密值: 1.订购它们 2.在给定区域内划分入口 3.以及其他查询的类似内容 一个查询的简短示例: SELECT something, ( 6371 * acos( cos( radians(".$userdatafromdbfetchedbefore['lat'].") ) * cos( radians( AES_D

我有一些sql查询,我在其中选择靠近用户位置的行。 使用AES_DECRYPT,我可以在查询中执行以下操作:

AES_DECRYPT(lat, :key)
我需要查询中的解密值:
1.订购它们
2.在给定区域内划分入口
3.以及其他查询的类似内容

一个查询的简短示例:

SELECT something,
(
    6371 * acos( cos( radians(".$userdatafromdbfetchedbefore['lat'].") ) * cos( radians( AES_DECRYPT(lat, :key) ) ) * cos( radians( AES_DECRYPT(lng, :key) ) - radians(".$userdatafromdbfetchedbefore['lng'].") ) + sin( radians(".$userdatafromdbfetchedbefore['lat'].") ) * sin(radians( AES_DECRYPT(lat, :key))) )
) AS distance
FROM 
    table
HAVING 
    distance <= ".$userdatafromdbfetchedbefore['maxrange']."
ORDER BY 
    e.orderdate 
DESC,
    distance  
ASC
LIMIT
    ".$start.", ".$offset."
选择一些东西,
(
6371*acos(弧度($userdatafromdbfetchedbefore['lat'].'))*cos(弧度($userdatafromdbfetchedbefore['lat'.]))*cos(弧度($userdatafromdbfetchedbefore['lat'.]))*CIN(弧度($userdatafromdbfetchedbefore['lat'.]))*sin(弧度($userdatafromdbfetchedbefore['lat'.]))
)作为距离
从…起
桌子
有

distancelibnaid不是内置在MySQL中的,因此您不能在MySQL查询中调用与
AES\u ENCRYPT()
等价的东西,然后获得预期的结果

但是,另一种方法是使用类似的库,它提供可搜索的身份验证加密。在决定使用它之前,请确保您理解和理解它

<?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);
请注意,浮点字段将始终生成固定长度的输出,即使输入具有不同的精度级别。这样做是为了防止攻击者从密文长度中学习信息

如果您选择,以上所有操作都将使用LibNasdine完成。如果有人好奇的话,每个人使用的确切加密是


请注意,您必须使用PHP而不是SQL来计算解密后的值


毕竟,在将数据存储到数据库之前对其进行加密的全部目的是将其隐藏在数据库服务器(以及任何可能破坏该服务器的攻击者)之外。

简短回答:你不能。libnaid并没有内置到MySQL中。长答案:你可以使用类似的方法来避开这个限制(同时获得更好的安全性)。@ScottArciszewski谢谢你的回答,根据我的问题,我找不到一个适合使用ciphersweet的例子。你能和我分享一个吗?看起来这个库可以执行与我在这里找到的相同的盲索引搜索:,但我必须在查询中获取已解密的值。在上面的“弧度(lat)”示例中,我需要像“52.5200°”这样的实际值,否则计算将无法进行。我发布了完整的答案,因为注释有点长。为什么在示例中选择64位?没有理由,完全是任意的。但是你应该在生产代码方面少一些懒惰:我不理解盲目的索引规划器。在给出的示例中,您选择了一个4位数字,该数字具有10000个可能性。如果我选择一个30个字符的文本怎么办?你有解密日期的例子吗?
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"
    }
  }
}