【发布时间】:2017-06-23 05:01:42
【问题描述】:
我想将 base64_encoded 字符串存储为二进制数据。因此,在插入 MySQL 的 LONGBLOB 字段之前,请在字符串上使用 base64_decode()。到目前为止一切顺利,但是当我从 MySQL 检索数据时,我无法生成我开始使用的正确 base64_encoded 字符串...
这怎么可能?提前致谢
编辑
存储的数据是使用 AES-256CBC OPENSSL 加密例程加密的字符串。
代码
对于我的代码,我使用 OpenSSL 加密字符串
$string = "Test";
$IV = "1234567890123456";
$key = "12345678901234561234567890123456";
$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, false, $IV);
$encrypted string is stored in LONGBLOB field by
$sql_insert_data = $mysqli->prepare("INSERT INTO `TBLName` (String) Values(?)");
$sql_insert_data->bind_param('s', $mysqli->real_escape_string($encrypted));
//Thereafter, it is retrieved by a select statement
$decrypted = openssl_decrypt($row['String'], "AES-256-CBC", $key, true, $IV);
当我对字符串执行 base64_encode 并将其作为 TEXT 值存储在数据库中时,上述方法有效。但是,当我不这样做时,上述方法不起作用...
谢谢
【问题讨论】:
-
如果你想将base64_encoded字符串存储为二进制数据,为什么不在字符串上使用
base64_encode()而不是base64_decode(),然后再插入MySQL的LONGBLOB字段呢?为了取回它,您可以在该字符串上使用base64_decode(columnname)来检索您的原始字符串。所以base64_decode(base64_encode('string'))是'string',但不是相反,除非'string'是正确的base64 编码字符串。 -
因为存储 base64_encoded 字符串需要更多的磁盘空间。我想优化我的存储,但是当我这样做时,我无法以原始方式恢复字符串。所以我用base64_decode插入一个base64_encoded字符串作为LONGBLOB。当我检索值时,我使用 base64_encode,但它与开始字符串不同
-
啊,好吧,我误会了。您的编程语言中的
base64_decode(base64_encode('string'))是否返回原始字符串?您可以添加一个不起作用的字符串示例吗?还要添加用于插入该字符串的查询,它可能会更改(例如,由于\0或由于转义)。我想更安全的方法是使用 mysql 函数对字符串进行解码和编码,因为将 base64 编码的原始字符串解析到查询中应该是安全的。 -
什么意思?我有一个 base64_encoded 字符串,我在之前执行的 LONGBLOB 字段 base64_decoded() 中插入了准备好的语句。当我检索它并执行 base64_encode() 时,我无法将字符串恢复为原始形式
-
这已经是伪代码(并且在不知道您的表名的情况下尽可能接近实际代码)。也许您应该发布您的查询并特别命名您的编程语言。