0

我已加密存储为文本字段的 mysql 表中的数据。一切最初都是用 Windows perl 编写的,并且仍然可以正常工作。我的问题是我在 Linux 上运行相同的代码,当我查询表时,perl 中的文本结果告诉我它更长(这导致我的解密因为太长而爆炸)。

这发生在运行相同的脚本,所以我知道没有代码差异。
Mysql 服务器是 5.1.63,在 OpenSuSE Linux 11.4 x64 上运行。Linux perl 是 v5.12.3 Windows perl 是 5.10.1 有问题的字段定义为文本,utf8_general_ci,当我通过 JDBC 访问它时,数据报告 128 字节,有问题的 SQL 很简单(精简到这里重要的部分)

my $gatherSQL = "select 
                  table.encryptedText from action.theTable table
                  where table.custno=" . $dbHandle->quote($custno) 
  my $getHandle = $dbHandle->prepare($gatherSQL);
  $getHandle->execute();
  my $arrayRef = $getHandle->fetchall_arrayref();
  foreach my $myrow (@$arrayRef)
  {
    $type = $$myrow[0];
  }
  $getHandle->finish();
#DB Handle is opened with a simple  
my $workSQLhandle = DBI->connect("dbi:mysql:$dataDB:$dataServer:$dataPort", $userToUse, $pwToUse);
return($workSQLhandle);  

当我在 Windows 中运行代码(通过 samba 共享)时,我得到的字段长度为 128(解密)从命令提示符运行的同一台机器上的相同代码告诉我相同的返回字符串是 193 个字符长(并且赢了'不解密)我对返回的结果进行了比较,它们是相同的,但 perl 告诉我一个比另一个长。

关于如何解决这个问题以及根本原因是什么的任何想法?

4

1 回答 1

1

检查是否 mysql/perl 正在对文本进行一些翻译。例如select length(table.encryptedText),看看 mysql 认为长度是多少。加密文本往往看起来像二进制垃圾,如果您将其存储在 TEXT 类型的字段中,它将受到自动字符集转换的影响。加密数据应该进入 BLOB 字段,在其他方面与 TEXT 相同,但不区分字符集。

于 2013-04-16T15:16:20.787 回答