未将加密数据插入mysql表

Posted

技术标签:

【中文标题】未将加密数据插入mysql表【英文标题】:Encrypted data not being inserted into mysql table 【发布时间】:2013-05-04 12:11:06 【问题描述】:

我正在尝试将我的加密例程从 des 升级到河豚。我有这个功能用于加密/解密:

function NewCryptStr($EncryptOrDecrypt,$Str)

  $Key='test';

  $IVSize=mcrypt_get_iv_size(MCRYPT_BLOWFISH,MCRYPT_MODE_ECB);
  $IV=mcrypt_create_iv($IVSize,MCRYPT_RAND);

  if($EncryptOrDecrypt==='Encrypt')
    
      $Str=mcrypt_encrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);
      $Str=mysql_real_escape_string($Str);
    

  if($EncryptOrDecrypt==='Decrypt')
    $Str=mcrypt_decrypt(MCRYPT_BLOWFISH,$Key,$Str,MCRYPT_MODE_ECB,$IV);

  return $Str;

这很好用:

$Str='test string to be encrypted then decrypted';
print "<p>Original $Str</p>\n";
$Str=NewCryptStr('Encrypt',$Str);
print "<p>Encrypted $Str</p>\n";
$Str=NewCryptStr('Decrypt',$Str);
print "<p>Decrypted $Str</p>\n";

然后我在电子邮件地址表上运行以下 php 脚本来转换一列纯文本并使用加密结果更新另一列:

$sql="select UID,Str from testdata order by UID";
$result=mysql_query($sql,$Link);

while($row=mysql_fetch_array($result))
  
    $Encrypted=NewCryptStr('Encrypt',$row[Str]);

    $sql="update testdata set Str2='$Encrypted' where UID=$row[UID]";
    print "<p>$row[Str] > $Encrypted</p>\n";
    print "<p>$sql</p>\n";
    mysql_query($sql,$Link) or die("failed $sql ".mysql_error());
  

它运行没有错误,并按我的预期打印出大量加密字符串,但是当我查看表中的数据时,没有任何记录被更新为与上面的 php 打印的相同数据。相反,Str2 中的大多数值都是空白的,其中一些包含 1 或 2 个字符。

打印的所有 sql 语句看起来都很好,并且单独运行它们会正确更新记录。

sql 表和mysql 连接都使用utf8 编码,Str & Str2 列是varchar 数据类型。

为什么我的表格没有用正确的数据更新?

编辑我已经解决了(绕过!)使用基本编码/解码 NewCryptStr 函数的输出/输入的问题。我仍然很想知道为什么当 sql 语句在单独执行时可以愉快地工作时,为什么我的表循环不工作。

【问题讨论】:

mysql_* 已弃用,我强烈建议您切换到 PDO 或 mysqli。另外,为什么您的 $EncryptOrDecrypt 变量是区分大小写的字符串,而不是布尔值?您究竟在哪里查看未按预期显示的数据? PHP 会抓取当前在表中的数据,如果 PHP 找到正确的数据,那么正确的数据就在那里。 mysql 升级在待办事项列表中,$EncryptOrDecrypt 变量只是为了我的可读性,而我正在尝试构建有效的东西。我正在 phpmyadmin 中查看数据。 PHP 没有找到正确的数据,正如我所说,print "&lt;p&gt;$row[Str] &gt; $Encrypted&lt;/p&gt;\n"; 行打印的加密数据不是表格中的结果。 【参考方案1】:

您的代码中有:$row[UID],未定义,因此不会更新任何记录。

$row[UID]更改为$row['UID']

用途:

$sql="UPDATE testdata SET Str2='".$Encrypted."' WHERE UID=".$row['UID'];

【讨论】:

实际上 PHP 处理得很好,尽管我同意 $row['UID'] 是最好的,同时将变量保留在引号之外。 在引号内外尝试 $row[UID] 和 $row['UID'] 的所有组合都会产生相同的结果。 很奇怪。请在此处粘贴打印的 $sql-s 之一。 示例:update testdata set Str='�r����B���n�' where UID=1 我已经解决了这个问题(见编辑),但仍然想知道到底出了什么问题! 我指出的肯定是一个问题。我在您的链接代码中没有看到的其他问题。您还应该在插入数据库之前base64_encode(不要有很多奇怪的字符)。解码前也要使用base64_decode

以上是关于未将加密数据插入mysql表的主要内容,如果未能解决你的问题,请参考以下文章

mysql对数据库字段存储的数据加密

PHP脚本未将表单数据插入数据库

用Navicat for MySQL向l数据库插入一条用户信息,密码加密怎么加。

mysql给密码字段加密

如何使用休眠插入加密数据

mysql 数据库取出字段md5加密后形成新字段再插入