[原载于programmers.stackexchange.com,标题为:Can you encrypt with AES+CBC and search the encrypted data ]
基本上,我将使用具有密码块链接模式或密码反馈模式或输出反馈模式的高级加密标准(我还没有决定)。每种模式都需要一个初始化向量。问题是我想让加密的字符串像这样“可搜索”:
假设我有一个数据库表列表以及每个表的“显示名称”。从概念上讲,列表看起来像这样(我用 {xxx} 表示 xxx 的加密形式,而 [IVx] 表示初始化向量):
ENC_DISPLAY_NAME | ENC_TABLE_NAME
------------------------ | -----------------
[IV1]{John's table} | [IV2]{TABLE_3574}
[IV3]{Eric's list} | [IV4]{TABLE_3100}
|
[IV5]{Darren's projects} | [IV6]{TABLE_2823}
[IV7]{Paul's contacts} | [IV8]{TABLE_5843}
现在假设我想允许对 ENC_DISPLAY_NAME 进行搜索。(只需要平等搜索。)我需要有某种方法来了解我想要查找的显示名称上使用了什么初始化向量。
我认为我应该计算显示名称的 128 位散列(可能是 CRC),并将其用作 IV 来计算加密字符串。也就是说,如果我想存储“Darren 的项目”,我应该这样做:
AESKey key = ...;
String str = "Darren's projects";
CRCType crc = ComputeCRC(str);
BinaryString enc = crc.ToBinaryString ( ).Concat
(EncryptWithAESandCBC(str, key, (IVType)crc));
INSERT INTO MY_TABLE(ENC_DISPLAY_NAME,ENC_TABLE_NAME) VALUES(enc, ...);
如果我想改为搜索字符串,请执行相同的步骤,除了最后一个,然后SELECT * FROM MY_TABLE WHERE ENC_DISPLAY_NAME=enc
.
这个以前试过吗?是否存在任何(安全)风险?
[相关问题:在给定明文及其密文的情况下计算 AES 加密密钥?]