在mysql查询中解密数据,就像使用aes\u decrypt一样

cwxwcias  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(380)

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

  1. AES_DECRYPT(lat, :key)

我需要查询中的解密值:
1订购
2在给定区域内划定入口
三。其他的查询也有类似的情况
一个查询的简短示例:

  1. SELECT something,
  2. (
  3. 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))) )
  4. ) AS distance
  5. FROM
  6. table
  7. HAVING
  8. distance <= ".$userdatafromdbfetchedbefore['maxrange']."
  9. ORDER BY
  10. e.orderdate
  11. DESC,
  12. distance
  13. ASC
  14. LIMIT
  15. ".$start.", ".$offset."

我不能在不同的查询中选择所有的行并用php操作结果,这对于100k+行是非常不重要的,而用户附近的行可能只有~100。
对我来说保持位置数据的加密是非常重要的,直到现在我才开始我的项目,因为加密不安全。
现在我的问题是如何用新的php实现的lib做同样的事情?
我找不到一个可行的例子。我刚刚发现了一个盲索引的例子,如果你像存储的一样加密搜索项,你可以找到一个值,但这在我的情况下是没有帮助的,因为我需要得到的值,通过距离公式运行在同一个查询。

oxiaedzo

oxiaedzo1#

libnadium没有内置到mysql中,所以不能调用与 AES_ENCRYPT() 从mysql查询中获取所需的结果。
但是,另一种方法是使用类似CipherWeet的库,它提供可搜索的认证加密。在决定使用它之前,请确保您了解它的特性和局限性。

  1. <?php
  2. use ParagonIE\CipherSweet\CipherSweet;
  3. use ParagonIE\CipherSweet\EncryptedRow;
  4. use ParagonIE\CipherSweet\Transformation\AlphaCharactersOnly;
  5. use ParagonIE\CipherSweet\Transformation\FirstCharacter;
  6. use ParagonIE\CipherSweet\Transformation\Lowercase;
  7. use ParagonIE\CipherSweet\Backend\FIPSCrypto;
  8. use ParagonIE\CipherSweet\KeyProvider\StringProvider;
  9. $provider = new StringProvider(
  10. // Example key, chosen randomly, hex-encoded:
  11. 'a981d3894b5884f6965baea64a09bb5b4b59c10e857008fc814923cf2f2de558'
  12. );
  13. $engine = new CipherSweet($provider, new FIPSCrypto());
  14. /**@var CipherSweet $engine */
  15. $row = (new EncryptedRow($engine, 'contacts'))
  16. ->addTextField('first_name')
  17. ->addTextField('last_name')
  18. ->addFloatField('latitude')
  19. ->addFloatField('longitude');
  20. // Notice the ->addRowTransform() method:
  21. $row->addCompoundIndex(
  22. $row->createCompoundIndex(
  23. 'contact_first_init_last_name',
  24. ['first_name', 'last_name'],
  25. 64, // 64 bits = 8 bytes
  26. true
  27. )
  28. ->addTransform('first_name', new AlphaCharactersOnly())
  29. ->addTransform('first_name', new Lowercase())
  30. ->addTransform('first_name', new FirstCharacter())
  31. ->addTransform('last_name', new AlphaCharactersOnly())
  32. ->addTransform('last_name', new Lowercase())
  33. );
  34. $prepared = $row->prepareRowForStorage([
  35. 'first_name' => 'Jane',
  36. 'last_name' => 'Doe',
  37. 'latitude' => 52.52,
  38. 'longitude' => -33.106,
  39. 'extraneous' => true
  40. ]);
  41. var_dump($prepared);

你应该看到类似的东西。中的值 [0] 会改变,但是 [1] 不会的。这是因为 [0] 包含行数据(某些字段已加密)。 [1] 仅包含盲索引(稍后可在选择查询中使用)。

  1. array(2) {
  2. [0]=>
  3. array(5) {
  4. ["first_name"]=>
  5. string(141) "fips:nrtzoaxvPIOA7jPskWVwJmC0q8WJqrsnqjPh3ifNPsRd2TAx6OwTDfSiMVCXSsSRNQb_nxJlW7TbAtf5UvQRWWKTGhk_kXxpZKdnTrpjbmxi0IgstSrZ126Qz6E0_lvjew0Ygw=="
  6. ["last_name"]=>
  7. string(137) "fips:98f5CLB24w0zSqCGPR0D2oq9wQvUwzxo_byAp6mKgMgoJkUHZX1oTtk4Cm8FXI7fsUI8HOG5sKQFGRn6cXMw1EOMGgpXZqiXEDb3jxEbg9s95d4g2NeVd4xs2tmX0xlZ0nSM"
  8. ["latitude"]=>
  9. string(145) "fips:d3TVGfnRFlvWxbfihgHqjpXlXU3HtkCAHzM0-4f1l5dAeQf2Vk5RDDVOGMQNM09r0O4UOAub6QTyHGezQ0bWKQ5omqoYCTBJE0Uf_2DSPfO7U4dG74phaP04iFgqpJ8G41q54Kv5t54="
  10. ["longitude"]=>
  11. string(145) "fips:IcnUnBZZOxJPYXk-F3v12O_krNb9JsexljiV4gJzgctTpxLFm7ql0tJRF7xP3wLrUtd1VyfYBf75ot7iOSIIIFqsuyKZQdI9UyKbqd87RTMsHbHgPouxgZBg1urlqpuWqbOYEFGiti4="
  12. ["extraneous"]=>
  13. bool(true)
  14. }
  15. [1]=>
  16. array(1) {
  17. ["contact_first_init_last_name"]=>
  18. array(2) {
  19. ["type"]=>
  20. string(13) "w6dsrxbathjze"
  21. ["value"]=>
  22. string(16) "546b1ffd1f83c37a"
  23. }
  24. }
  25. }

请注意,浮点字段将始终生成固定长度的输出,即使输入具有不同的精度级别。这样做是为了防止攻击者从密文长度中学习信息。
如果您选择 ModernCrypto 而不是 FIPSCrypto ,以上所有操作都将使用锂钠完成。如果有人好奇的话,这里会记录每个人使用的确切加密方法。
请注意,您必须用php而不是sql来计算解密后的值。
毕竟,在将数据存储到数据库之前对其进行加密的关键是对数据库服务器(以及任何可能危害该服务器的攻击者)隐藏数据。

展开查看全部

相关问题