【问题标题】:What are different ways to sort an encrypted column? [closed]对加密列进行排序有哪些不同的方法? [关闭]
【发布时间】:2015-11-21 09:19:35
【问题描述】:

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

我正在遍历每一行并将其添加到数组中。然后我对数组进行排序。如果行数超过 10K,这会变得非常慢。

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

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

谢谢

【问题讨论】:

  • 您能否澄清一下,您是否在插入数据库之前进行了加密?使用mysql的ENCRYPT?您期望有多少行?
  • 是的,我使用 mcrypt 加密了数据并存储了加密的字符串。现在,数据库中有大约 12K 行,但我想每页列出 25 行。

标签: mysql sorting encryption


【解决方案1】:

架构

-- 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 应用正常分页。

遵循最佳实践的密钥管理。一个模糊的评论,但我把它扔在那里。

【讨论】:

    【解决方案2】:

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

    您可以在它们上放置一个自动递增的 ID 列并使用它进行排序/分页。你也可以在它们上面加上一个插入时间戳。

    但是,如果您只想要一个稳定的排序顺序,那么每次检索它们时它们都以相同的顺序出现,您可以简单地 ORDER BY 加密值。如果它们存储在 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-21
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多