我的问题如下:
在现有数据库中,我想加密几列中的数据。 列包含不同长度的字符串。
我不想更改列的大小,因此加密需要生成输入文本的等长文本表示。
加密算法的优势是次要的,但我当然希望它能够尽可能强大。否则我不需要加密数据。但最重要的是输出的大小。
这可能吗? 如果是这样,我该怎么做?
我有兴趣在.NET中这样做。没有数据库级加密。
答案 0 :(得分:17)
在你的约束中,我会在CFB模式下使用AES,它会将其转换为流密码,输出长度将与输入长度相同。除非你将字符串存储在blob中,否则你需要对输出进行十六进制或base64编码以使其对char友好,这将使长度增加100%或33%。
答案 1 :(得分:2)
你应该花一点时间想想你想要解决的真正问题。我看到很少有数据库加密真的很麻烦的实例,因为信息很少直接从数据库流向最终用户。
如果您需要保护数据库的内容,那么您应该查看其标准访问控制机制。
答案 2 :(得分:2)
安全加密要求密文大于明文;否则相同的明文总会产生相同的密文,并且没有无效的密文,这两者都是弱点。
但是,如果您真的无法扩展您正在加密的数据,那么您可以做的最好的是可调整块模式。查找用于磁盘加密的XTS和CMC模式。
答案 3 :(得分:1)
这通常是不可能的,因为(以天真的方式),您会希望加密字符串比纯文本包含更多信息。
解决问题的模糊想法:
- 将您的号码映射到较短的文本字符串:两个数字可以映射到一个字符
- 你可以避免加密前x位数吗?
- 将它加密为整数而不是文本有什么可能性?
答案 4 :(得分:1)
你可能会寻找一个可调整的分组密码。如果您的行具有唯一标识符(例如主键),则唯一标识符可用作调整。这种加密的优点是您不需要任何IV来随机化加密。即使列多次包含相同的值,由于调整,此值也会以不同方式加密。
安全性较低的解决方案是在计数器模式下使用块密码并使用唯一标识符来计算计数器。但是这种模式有一个严重的缺点:除非你也改变了唯一标识符,否则你无法安全地重新加密字段。
由于两种情况都不会使密文随机化,因此攻击者可能会观察到某个字段是否发生了变化。这可能泄漏一些有价值的信息。另请注意,两种情况都不能为您提供任何数据完整即使攻击者无法解密信息,他仍然可以将其改为他的优势。
答案 5 :(得分:0)
Vigenère cipher可以做到这一点。但它是旧的(预计算机)并且只有在您的关键短语长于您想要加密的最长字符串时才安全。另外,拥有一个充满了使用相同关键短语加密的字符串的数据库可能会使这一周加密,特别是如果可以猜到普通文本。
它或多或少类似于cesar shift算法(在纯文本中为每个字母添加n),除了根据关键短语对每个被更改的字母的n不同。
如果你的关键短语是ABCDEFG,那么对于第一个输入字母,n = 1,对于第二个输入字母,则表示n = 1.
随机密钥短语比纯文本长,输出就像随机(安全)一样。但是我相信如果你用相同的密钥加密许多字符串,这将会崩溃。 ..
答案 6 :(得分:0)
任何分组密码都可以。基本上,您输入一个固定长度的块并获得类似大小的加密块。密码是从{0,...,2 ^ blocklength}到{0,...,2 ^ blocklength}的排列。 (输入长度必须填充到块长度边界。)
这里的问题是,如果列是文本,则不一定要在其中放置二进制cryptotext,您必须将数据编码为文本格式,例如base64(增加33%)。
AES是一种广泛使用的分组密码标准。
答案 7 :(得分:0)
理想情况下,如果现有列大于标准块密码中的单个块(AES为16个字节,TDES为8个字节),则可以在CTS (cipher text stealing) mode中进行加密。不幸的是,.net在其任何包含的算法中都不支持CTS。 : - (
通常,CTS使用随机IV,它必须与密文一起存储,但如果您不介意加密到相同密文的相同明文值,则可以使用行ID或甚至是常量值。