【问题标题】:decrypted value from mysql pdo php来自mysql pdo php的解密值
【发布时间】:2016-10-12 05:51:40
【问题描述】:
$stmt2 = $dbh-> prepare("Select * from encryptme where ".decrypt('encryptedcolumn', $key)." = ?");
$stmt2 -> bindValue(1, $dec, PDO::PARAM_STR);
$stmt2 -> execute();

我有encrypt()decrypt() 我在使用encrypt() 后保存了数据,现在我想选择数据但我无法选择,因为数据已加密。我尝试的是我在列名中使用了该函数,但它不起作用我收到错误提示

带有消息“SQLSTATE[42000]”的未捕获异常“PDOException”:语法错误或访问冲突:1064 您的 SQL 语法有错误;查看与您的 MySQL 服务器版本相对应的手册,了解在 '=' 附近使用的正确语法

如何解密查询语句中的列?

【问题讨论】:

  • 您想解密从查询中返回的返回,不是吗?因此,您需要获取加密列中的值,然后对这些值运行解密。
  • 我想要的是我想从列中选择解密的值..你$dec它是解密的值..我想选择列encryptme作为@的值987654327@ 但我看不到它,因为该列已加密.. 所以我所做的是我在列上运行函数decrypt().. 但我得到错误.. 如何解密 where 子句中的值? @JonStirling
  • @JonStirling 如何在 where 子句中做到这一点?
  • 列的内容可能是加密的,但列名很可能不是,这有什么意义?
  • @BrownmanRevival 我猜这取决于你的加密/解密方法。

标签: php mysql encryption pdo


【解决方案1】:

查询时不能使用 php 函数来解密数据库中的值。 (不过如果支持加密方式,也可以使用数据库函数)

您可以改为将加密参数发送到数据库,以将其与加密的存储值进行比较。

获取数据后,您可以解密该值以执行任何您需要的操作。

在新信息后编辑:

如果您不能可靠地加密 php 中的值,则必须从数据库中获取所有数据,然后对其进行解密,以便比较这些值。

【讨论】:

  • 我已经尝试过了,但加密的值并不总是相同的,它们总是不同的,所以我不能使用它..这就是为什么我认为解密会起作用。 您可以改为向数据库发送一个加密参数,以将其与加密的存储值进行比较。我不明白如何解决这个问题?
  • “您可以改为将加密参数发送到数据库,以将其与加密的存储值进行比较。” - 这是否可能取决于encrypt() 是否是语义安全(随机)。如果是,那么您所提议的内容是不可能的。如果不是,则可能使用了ECB
  • @ArtjomB。是的,它是随机的,因为我可以在数据库中看到,当它们是相同的数据时,值是不同的..
  • 哦,好吧。这意味着您必须获取所有数据,然后使用解密在 php 中进行比较。如果没有人知道更好的方法,array_filter() 可能会有所帮助。
  • 是的,我看到了问题所在。我会继续研究这个问题,也许有一个好方法。
【解决方案2】:

这是您的解决方案

$stmt2 = $dbh-> prepare("Select * from encryptme where CAST(AES_DECRYPT(encryptedcolumn, 'key') AS CHAR) = ?");
$stmt2 -> bindValue(1, $dec, PDO::PARAM_STR);
$stmt2 -> execute();

一切顺利。

【讨论】:

  • 这就是我尝试过的错误...如果您检查我的问题,您会认为我尝试过
  • 这里,AES_DECRYPT 必须与 encrypt() 兼容(不管是什么)。你怎么知道它兼容?
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 2016-01-14
  • 2015-08-18
  • 1970-01-01
  • 2020-01-28
  • 2016-07-06
  • 2015-06-23
相关资源
最近更新 更多