繁体   English   中英

使用PHP Mcrypt加密并使用MySQL aes_decrypt解密?

[英]Encrypt with PHP Mcrypt and Decrypt with MySQL aes_decrypt?

是否可以使用PHP mcrypt加密数据并使用MySQL AES_DECRYPT在数据库中解密数据? 目前,我正在RIJNDAEL_128在PHP上使用mcrypt 我还确保数据库中的加密字段的数据类型为blob 但是,具有正确密钥的AES_DECRYPT仍然返回NULL 关于如何使它起作用的任何建议?

我在这里找到了一些很好的帮助

请注意,这适用于纯文本中最多65519个字符的加密文本。 (如果没有UTF-8编码,可能会更多)

PHP代码进行加密:

// MySQL uses 16 bytes key for 128 encryption/decryption
$key = "ABCDEF0123456789";

$plaintext = "This string was AES-128 / EBC / ZeroBytePadding encrypted.";
// Optionally UTF-8 encode
$plaintext_utf8 = utf8_encode($plaintext);
// Find out what's your padding
$pad_len = 16 - (strlen($plaintext_utf8) % 16);
// Padd your text
$plaintext_utf8 = str_pad($plaintext_utf8, (16 * (floor(strlen($plaintext_utf8) / 16) + 1)), chr($pad_len));

// Encryption
mt_srand();
$td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, false);
// Generates a warning about empty IV but it's Ok
$ciphertext = mcrypt_generic($td, $plaintext_utf8);
mcrypt_generic_deinit($td);
$ciphertext = mysql_real_escape_string($ciphertext);

// Store in MySQL
$mysqli = new mysqli("localhost", "test", "test", "test");
$mysqli->set_charset("utf8");
$mysqli->query("insert into test(content) value ('$ciphertext')");
$mysqli->close();

用于查询string was SQL查询string was

SELECT CAST(AES_DECRYPT(content,'ABCDEF0123456789') AS CHAR) AS content
FROM test
WHERE CAST(AES_DECRYPT(content,'ABCDEF0123456789') AS CHAR) like '%string was%';

输出为:

This string was AES-128 / EBC / ZeroBytePadding encrypted.

注意:MySQL表是由以下人员创建的:

create table test (
id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
content blob ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

如果您在PHP方面使用mcrypt RIJNDAEL_128进行加密,那么我建议在PHP方面保留解密。 不久前,我遇到了同一个问题:我的一个应用程序的学生证号。 我选择不让数据库进行任何类型的加密/解密。 我强烈建议将其留给一个系统(在本例中为mcrypt)。 原因是现在您的“活动”零件较少,可能会出错,从而使维护工作更加轻松,并使审计跟踪记录更加容易。 您的数据库应用于存储数据(毫无意外),因此只需确保数据库中的长度适合您要存储的内容即可。

希望这可以回答您的问题/以某种方式帮助您,因为这就是我的做法/实际上是在做。

现在,如果您需要查看一些有关其工作方式的代码,请问一下。 从我的理解来看,尽管我认为您知道如何进行加密/解密,但是您只是在问数据库是否应该解密信息。

如果希望您的解决方案可扩展到许多用户,则在搜索期间在dabatase中解密数据似乎是一个问题。

我建议您通过“ bloom filter”查找旧的宝石。 它通常用于拼写检查器,但也可以用于加快数据库中的搜索速度。 https://en.wikipedia.org/wiki/Bloom_filter

布隆过滤器是位掩码。 您需要创建一系列不同的散列函数,这些散列函数生成的散列大小与布隆过滤器相同,但每个散列函数仅设置一个随机位。

然后,您通过这些哈希函数运行一个单词(字符串),并将这些位添加到过滤器中。 现在,过滤器“知道”您的单词在其中。

该过滤器很紧凑,因为单词可以在过滤器中相互重叠。

要检查单词是否在过滤器中,您只需对其运行哈希函数,并检查是否使用二进制AND操作在过滤器中设置了所有位。 MySQL支持二进制操作。

您永远不能从过滤器中删除一个单词,因为这些位可以是多个单词的一部分。

文本永远无法从Bloom过滤器中恢复

布隆过滤器永远不会产生假负数,可能产生假正数 如果得到误报,则与数据集(存储在过滤器中的单词)相比,过滤器太小,或者哈希功能不够好。 您需要多少个哈希函数取决于数据的大小,请尝试5-20。

小费! 您还可以将单词对或单词三元组添加到Bloom过滤器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM