SQL 服务器一致列加密
SQL Server Consistent Column Encryption
我有一个相当简单的 SQL 服务器要求,我有一个 int
类型的列,我想加密该列,因为用于加密该列的函数应该生成每次调用时都具有相同的值。
上下文
- 我的系统有 2 个用户角色源角色、目标角色
- Source Role 用户生成具有以下结构的 tables
ID => 整数
元数据列 => varchar
- 我的系统将生成带有混淆 ID
的源 table 的副本
- Target 角色用户将有权访问生成的 table 并且可以 add/update 元数据列,但是他们不应该知道明确的 ID
我的试炼
- 我已经尝试
ENCRYPTBYKEY
使用身份验证器和不使用身份验证器,但是每次我调用该函数时,它都会生成不同的值,这在某些情况下可能是有益的,但我的不是其中之一:)
- 我也尝试过使用
ENCRYPTBYASYMKEY
并且出现了相同的行为,即每次调用的输出不同
- 我还发现这个 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 之类的东西,这个选项很有用,例如您不想让公司有多少产品待售。
我有一个相当简单的 SQL 服务器要求,我有一个 int
类型的列,我想加密该列,因为用于加密该列的函数应该生成每次调用时都具有相同的值。
上下文
- 我的系统有 2 个用户角色源角色、目标角色
- Source Role 用户生成具有以下结构的 tables ID => 整数 元数据列 => varchar
- 我的系统将生成带有混淆 ID 的源 table 的副本
- Target 角色用户将有权访问生成的 table 并且可以 add/update 元数据列,但是他们不应该知道明确的 ID
我的试炼
- 我已经尝试
ENCRYPTBYKEY
使用身份验证器和不使用身份验证器,但是每次我调用该函数时,它都会生成不同的值,这在某些情况下可能是有益的,但我的不是其中之一:) - 我也尝试过使用
ENCRYPTBYASYMKEY
并且出现了相同的行为,即每次调用的输出不同 - 我还发现这个 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 之类的东西,这个选项很有用,例如您不想让公司有多少产品待售。