Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何加密字符串并获得等长的加密字符串?_.net_Encryption - Fatal编程技术网

.net 如何加密字符串并获得等长的加密字符串?

.net 如何加密字符串并获得等长的加密字符串?,.net,encryption,.net,Encryption,我的问题如下: 在现有数据库中,我希望加密两列中的数据。 列包含不同长度的字符串 我不想更改列的大小,因此加密需要生成输入文本的等长文本表示 加密算法的强度是次要的,但我当然希望它尽可能强大。否则我就不需要加密数据了。但最重要的是产出的规模 这可能吗? 如果是这样,我该怎么做 我对在.NET中做这件事很感兴趣。没有数据库级加密。这通常是不可能的,因为(以一种天真的方式)您希望加密的字符串比纯文本包含更多的信息。 解决问题的模糊想法: -将您的号码映射到较短的文本字符串:两个数字可以映射为一个字

我的问题如下:

在现有数据库中,我希望加密两列中的数据。 列包含不同长度的字符串

我不想更改列的大小,因此加密需要生成输入文本的等长文本表示

加密算法的强度是次要的,但我当然希望它尽可能强大。否则我就不需要加密数据了。但最重要的是产出的规模

这可能吗? 如果是这样,我该怎么做


我对在.NET中做这件事很感兴趣。没有数据库级加密。

这通常是不可能的,因为(以一种天真的方式)您希望加密的字符串比纯文本包含更多的信息。 解决问题的模糊想法:
-将您的号码映射到较短的文本字符串:两个数字可以映射为一个字符。
-您能避免加密前x位吗?
-可以将其加密为整数而不是文本吗?

可以这样做。但它是旧的(预计算机),只有在密钥短语长度超过要加密的最长字符串时才安全。另外,如果数据库中充满了使用相同密钥短语加密的字符串,则可能需要一周的加密时间,特别是如果可以猜测纯文本的话

它的工作原理或多或少类似于cesar shift算法(将n添加到纯文本中的每个字母中),不同的是n对于每个被更改的字母是不同的,基于一个关键短语

如果你的关键词是ABCDEFG,那么它意味着输入的第一个字母n=1,第二个字母n=2,等等


对于比纯文本长的随机关键字短语,输出也是随机的(安全的)。但是我相信如果你有很多用同一个密钥加密的字符串,这会崩溃

任何分组密码都可以。本质上,您输入一个固定长度的块,然后得到一个大小相似的加密块。密码是从{0,…,2^blocklength}到{0,…,2^blocklength}的置换。(输入长度必须填充到块长度边界。)

这里的问题是,如果列是文本,则不一定要在其中放置二进制加密文本,并且必须将数据编码为base64等文本格式(大小增加33%)


AES是一种广泛使用的分组密码标准。

您应该花一分钟时间思考您试图解决的真正问题。我看到很少有数据库加密是真正必要的,因为信息很少直接从数据库流向最终用户


如果您需要保护数据库的内容,那么您也许应该研究它的标准访问控制机制

您可以寻找可调整的分组密码。如果行具有唯一标识符(例如主键),则该唯一标识符可以用作调整。这种加密的优点是不需要任何IV来随机加密。即使一列多次包含相同的值,该值也会由于调整而以不同方式加密

不太安全的解决方案是在计数器模式下使用分组密码,并使用唯一标识符来计算计数器。但这种模式有一个严重的缺点:除非同时更改唯一标识符,否则无法安全地重新加密字段


由于这两种情况都不会使密文随机化,攻击者可能会观察到某个字段是否已更改。这可能会泄露一些有价值的信息。还要注意的是,这两种情况都没有提供任何数据完整性。即使攻击者无法解密信息,他也可以将其更改为对自己有利的信息。

理想情况下,如果现有列大于标准分组密码中的单个块(AES为16字节,TDE为8字节),则可以在中加密。遗憾的是,.net在其包含的任何算法中都不支持CTS:-(


通常CTS使用随机IV,必须与密文一起存储,但如果您不介意将相同的明文值加密为相同的密文,您可以使用行ID,甚至是常量值。

在您的构造函数中,我将在模式中使用AES,将其转换为流密码,输出长度将为与输入长度相同。除非将字符串存储在blob中,否则需要对输出进行十六进制或base64编码,以使其对字符友好,这将使长度增加100%或33%


在这里。

安全加密要求密文大于明文;否则相同的明文总是导致相同的密文,并且没有无效的密文,这两者都是弱点


但是,如果您真的无法扩展正在加密的数据,最好使用可调整的块模式。查找用于磁盘加密的XTS和CMC模式。

为什么必须相同长度?您可以始终在数据库中单独存储原始长度(如果这很重要),并使用强大的加密算法。为什么你不能更改表并使这些列变大?我不明白为什么这会是一个问题……这是一个问题。我们有150多个列需要变大,另一个遗留系统与数据库通信。但是,我们现在正在考虑使它们变大并使用AES。对于我来说在这里,安全确实是一个小问题,我最终使用了ROT47。“因为它还包括一些关于密码的知识”-嗯……你确定吗?哦,对不起,我的意思是密码会保存更多的信息。@Christian80证明你是对的。为什么Microsoft会将其添加到枚举中而不费事实现它对我来说是个谜。在这里的众多建议中,jkf是唯一正确回答这个问题的人。事实上,你我们需要的是一条小溪,而不是一条小溪