SQL 服务器一致列加密

SQL Server Consistent Column Encryption

我有一个相当简单的 SQL 服务器要求,我有一个 int 类型的列,我想加密该列,因为用于加密该列的函数应该生成每次调用时都具有相同的值。

上下文

  1. 我的系统有 2 个用户角色源角色、目标角色
  2. Source Role 用户生成具有以下结构的 tables ID => 整数 元数据列 => varchar
  3. 我的系统将生成带有混淆 ID
  4. 的源 table 的副本
  5. Target 角色用户将有权访问生成的 table 并且可以 add/update 元数据列,但是他们不应该知道明确的 ID

我的试炼

  1. 我已经尝试 ENCRYPTBYKEY 使用身份验证器和不使用身份验证器,但是每次我调用该函数时,它都会生成不同的值,这在某些情况下可能是有益的,但我的不是其中之一:)
  2. 我也尝试过使用 ENCRYPTBYASYMKEY 并且出现了相同的行为,即每次调用的输出不同
  3. 我还发现这个 forum post 提到 SQL 服务器正在使用随机初始化向量

我的问题是,考虑到该函数将用于加密具有数百万条记录的 tables,有哪些可能的解决方案可以实现我的要求。

您必须编写自己的加密功能才能执行此操作,但您为什么要这样做,imo 可能存在安全风险

What are the possible solutions to achieve my requirements

有none.

TLDR;

现代加密必须满足几个属性,每个属性之一是 Semantic security。外行术语中的语义安全意味着,如果您有加密的消息,则无法获得有关纯文本消息的任何其他信息。但是,您的要求直接与此相矛盾,因为通过访问足够多的加密消息,可以推导出纯文本的含义。这就是德国机器 Enigma 在 2-nd World War 期间被破解的方式(他们重复使用了密钥,而你想修复 IV。结果是一样的 - 可以显示纯文本)。

正是出于这个目的 Initialisation Vectors 已经发明并且必须使用。

你要做什么?嗯,真的有两个选择:

  • 阐明您的要求
  • 使用不暗示语义安全的地图,例如(1 -> 9478、2 -> 9572 等)。如果你只是想混淆 ID 之类的东西,这个选项很有用,例如您不想让公司有多少产品待售。