对加密列进行排序有哪些不同的方法?

时间:2015-11-21 00:43:05

标签: mysql sorting encryption

我在MySQL中有一个AES加密列,我想对其进行排序并对结果进行分页。

我将遍历每一行并将其添加到数组中。然后我对数组进行排序。使用>这变得非常慢10K行。

我正在考虑添加一个额外的列并添加0 - #####中的顺序,但我看到的问题是每次在中间插入一行时都必须更新排序。< / p>

如果有人有这方面的经验,我只是想集思广益。

谢谢

2 个答案:

答案 0 :(得分:3)

模式

-- drop table encryptIt;
create table encryptIt
(   id int auto_increment primary key,
    ciphertext blob not null
);

按原样从PHP加密,或查看This answer

现在是时候直接从mysql中分页出来而不需要PHP循环和排序。假设您将秘密your_key提供给mysql。假设你可以得到一个基本的计数,因此知道你的页数(每页25)。

SELECT id,CAST(AES_DECRYPT(ciphertext,'your_key') AS CHAR) AS cleartext
FROM encryptIt
order by cleartext
limit 0,25; -- start at first block of 25, bring back 25
-- limit 2,25; -- start at 3rd block of 25, bring back 25

正常分页使用order by和limit。

遵循最佳做法的密钥管理。一个模糊的评论,但我把它扔出去。

答案 1 :(得分:-1)

据推测,您的加密行没有任何自然排序顺序。 (这是加密它们的一部分。)

您可以在其上放置一个自动增量ID列,并使用它进行排序/分页。您还可以在其上添加插入时间戳。

但是,如果您想要的只是一个稳定的排序顺序,那么每次检索它们时它们都以相同的顺序出现,您可以简单地按加密值进行排序。如果它们存储在TEXT或二进制大对象(BLOB)列中,您可以按该列的内容进行排序。

有一个名为max_sort_length的设置,用于控制大对象列中ORDER BY考虑的字节数。通过比较前几十个字节,可以可靠地对包含加密数据的列进行排序。为此,在使用ORDER BY进行查询之前先发出此命令。

SET max_sort_length 48

阅读本文以获取更多信息。 https://dev.mysql.com/doc/refman/5.7/en/blob.html