使用encryptr包加密相同ID得到不同结果,如何实现同ID加密结果一致?
问题原因
encryptr::encrypt 默认采用带随机初始向量(IV)的AES加密算法,每次加密操作都会自动生成新的随机IV,因此即使输入明文完全相同,输出的密文也会存在差异,这是该包默认的安全设计,目的是避免攻击者通过相同密文反推明文的一致性。
解决方案
方案1(推荐:不修改默认加密安全逻辑)
先提取所有唯一ID做加密映射,再将映射结果回写到原数据集,既保留默认随机IV的高安全性,也能保证相同ID对应相同密文:
library(dplyr) library(encryptr) # 构造示例数据 ID <- c('1','1','1') salary <- c(21000, 23400, 26800) data <- data.frame(ID, salary) # 1. 生成唯一ID的加密映射表,每个ID仅加密1次 id_map <- data %>% distinct(ID) %>% mutate(ID_encrypted = encryptr::encrypt(ID)) # 2. 将加密结果关联回原数据集 data <- data %>% left_join(id_map, by = "ID")
方案2(需修改加密参数,安全性有所降低)
如果要直接在encrypt调用时实现相同明文输出相同密文,需要手动指定固定初始向量(IV),同时全程复用同一个固定密钥:
library(dplyr) library(encryptr) library(openssl) # 构造示例数据 ID <- c('1','1','1') salary <- c(21000, 23400, 26800) data <- data.frame(ID, salary) # 提前生成固定密钥与固定IV,生成后保存到安全位置复用,不要每次运行重新生成 fixed_key <- encryptr::gen_key() fixed_iv <- openssl::rand_bytes(16) # AES加密要求IV固定为16字节长度 # 加密时指定固定密钥与IV data <- data %>% mutate(ID_encrypted = encryptr::encrypt(ID, key = fixed_key, iv = fixed_iv))
注意:固定IV的加密方式会降低数据安全性,攻击者可通过相同密文判断明文一致性,仅适合对去重一致性要求高于安全等级的场景使用。
内容的提问来源于stack exchange,提问作者Edi Itelman
相关产品推荐
相关产品推荐

