c# - 在 C# 中创建我的对称 key

标签 c# security encryption cryptography aes

一直在审查一些对称加密方法,我看到了很多在类中对私有(private)静态变量进行硬编码的示例,通常类似于:

string key = "THISISYOURENCRYPTIONKEY!"

然后再往下的某个地方,代码使用它进行加密/解密。

抛开正确的实现/算法/策略以及存储位置不谈,我有一个简单的问题。 我的 key 的值应该是多少?即我如何生成它?我看到的大多数示例要么使用他们刚刚组成的一些随机句子,要么使用生成字节数组的 .net 类以及返回 byte[] 的加密安全随机数生成器。我用它 byte[] 做什么?我会假设它不应该是一个字节数组,而是一个我可以保存在某个地方的实际字符串(并且可能不在我类(class)的顶部)。

有人可以为我澄清一些基础知识吗?

谢谢!

最佳答案

对于对称加密算法来说,最常需要一个二进制数组作为 key 。它提出了以下问题:

  • 如何获取 key 的二进制数据?

key 应该是随机的。如果不是随机的,就更容易被别人揣摩出来。不幸的是,由计算机生成随机数并不是那么简单。简单的随机生成算法是循环的,周期很短,所以很容易找到用于key的段。有时他们试图从现实世界中获取一些输入作为参数来生成随机数,例如时间(可预测,不安全)来自硬盘驱动器的一些数据,来自网络的数据,让用户输入一些东西等等。这些是或多或少可以预见的事情。也可以购买为此目的而设计的设备,这些设备具有强大的算法和存储良好的种子值,或者它们具有某种粒子检测器,因为这些粒子会随机撞击设备。关键是,如果可能的话, key 必须是不可预测的。

  • 您需要存储 key 吗?

在对称加密的情况下,相同的 key 用于加密和解密。因此,如果要解密数据,则必须至少第二次使用 key - 因此必须以某种方式保留它。保留 key 是危险的,因为其他人可能会得到它。将 key 保存到硬盘驱动器?它适用于非常简单的系统,但很容易找到 key 。 Windows 提供 key storage providers ,并且有许多实现可用。简单的实现将 key 存储在硬盘上,但它是用另一个 key 加密的——当然 key 存储在硬盘上,否则 Windows 将无法为您解密 key 。可以以在启动期间获取“主” key 的方式设置系统,因此管理员必须键入它,然后 key 存储在内存中 - 但管理员必须记住“主 key ”,也许它被写在他钱包里的一张纸上 :) 您也可以购买专为存储 key 而设计的设备,这些设备具有非常复杂的机制来安全地存储 key ,使用专为执行此操作而设计的芯片。这些设备通常可以进行加密/解密,所以 key 不必离开设备——只有当它必须共享时,这在对称算法的情况下是不可避免的。所以这是一个很大的话题,一个人可以花一大笔钱来保护 key ,其他人只是乐于使用 Windows key 存储。

人们无法记住 32 字节的六边形数组,这也是发明 key 推导算法的原因之一。这些获取输入文本并从中生成伪随机数据。当然,此数据不如真正的随 secret 钥安全。您可以使用 rfc2898derivebytes在 .net 中。

  • 您需要多次使用 key 吗?

这取决于您的使用情况,但最好避免多次使用 key 。通信协议(protocol)在握手期间就新的对称 key 达成一致,并在一段时间后更改 key ,即使它们仍然处于连接状态。这是因为长时间使用 key 意味着 key 存在时间更长(意味着窃取它的时间更长)并产生更多数据,这些数据是分析它并尝试找出 key 的良好输入。此外,如果您使用单个 key 加密所有内容,那么获取单个 key 就足以窃取所有数据。如果有更多的 key ,如果 key 被知道,只有部分数据是危险的。一次pad encryption是唯一无法根据统计分析解密的加密。在该算法中, key 的每一位仅使用一次。

关于c# - 在 C# 中创建我的对称 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30657323/

相关文章:

c# - Resharper:文件标题文本不会自动用于新文件

c# - 是否可以将 DataAnnotations 与接口(interface)一起使用?

c# - 如何为单个字符着色并保持适当的间距/字偶距/对齐方式?

java - 从 NVD 数据源中提取数据和 cpe_match 含义

security - Azure云服务Web应用程序未找到-404

一次复制 8 个字节的结构

c# - 为什么 .Net 最佳实践是将自定义属性设计为密封的?

javascript - IE 屏蔽我的 C 盘上的 activex 内容有什么意义?

c++ - Endianness 和 C API 的 : Specifically OpenSSL

C# AES Base64 加密(字符串)