一直在审查一些对称加密方法我已经看过很多在类中硬编码私有静态变量的例子,通常是这样的:
string key = "THISISYOURENCRYPTIONKEY!"
然后进一步向下,代码使用它进行加密/解密。
暂且不谈正确的实现/算法/策略以及存储位置,我有一个简单的问题。 我的钥匙的价值应该是什么? I.e.我该如何生成它?我看到的大多数示例要么使用他们刚刚编写的一些随机句子,要么使用.net类生成一个带有加密安全随机数生成器的字节数组,返回byte []。我怎么处理byte []?我认为它不应该是一个字节数组,而是一个我可以保存在某个地方的实际字符串(可能不是我班级的顶部)。
有人可以为我清理一些基础知识吗?
谢谢!
答案 0 :(得分:2)
通常需要二进制数组作为密钥。它提出了以下问题:
密钥应该是随机的。如果它不是随机的,那么其他人更容易理解。不幸的是,计算机生成随机数并不是一件容易的事。简单的随机生成算法是循环的,非常短的循环,因此很容易找到用于密钥的段。有时他们试图从现实世界中获得一些输入作为生成随机的参数,如时间(可预测,不安全)来自硬盘的一些数据,来自网络的数据,让用户输入内容等等。或多或少可预测的事情。也可以购买为此目的而设计的设备,这些设备具有非常好的存储种子值的强算法,或者它们具有某种粒子检测器,因为这些粒子随机地撞击设备。关键是,如果可能,密钥必须是不可预测的。
在对称加密的情况下,相同的密钥用于加密和解密。因此,如果要解密数据,则必须至少第二次使用密钥 - 因此必须以某种方式保留密钥。保留钥匙是危险的,因为其他人可能会得到钥匙。将密钥保存到硬盘驱动器?它适用于非常简单的系统,但很容易找到密钥。 Windows提供key storage providers,并且可以使用许多实现。简单的实现将密钥存储在硬盘驱动器上,但它用另一个密钥加密 - 但当然密钥存储在硬盘驱动器上,否则Windows将无法为您解密密钥。可以在启动时获取“主”键的方式设置系统,因此管理员必须键入它,然后将密钥存储在内存中 - 但管理员必须记住“主键”,也许它被记录在他的walet中的纸上:)你也可以购买用于存储密钥的设备,这些设备具有非常复杂的机制来安全地存储密钥,使用专门设计的芯片来实现这一点。这些设备通常可以进行加密/解密,因此密钥不必离开设备 - 只有在必须共享时才能离开,这在对称算法的情况下是不可避免的。所以这是一个很大的话题,人们可以花大钱来保护密钥,其他人只是很乐意使用Windows密钥库。
人们不记得32字节六进制数组,这是密钥派生算法发明的原因之一。这些获取输入文本并从中生成伪随机数据。当然,这些数据不如真正的随机密钥安全。您可以在.net中使用rfc2898derivebytes。
这取决于您的使用案例,但最好避免多次使用密钥。通信协议在握手期间就新的对称密钥达成一致,并在一段时间后更改密钥,即使它们仍然连接。这是因为长时间使用密钥意味着密钥存在时间更长(意味着更多时间来窃取它)并产生更多数据,这是分析它并尝试找出密钥的良好输入。此外,如果使用单个密钥加密所有内容,只需获取一个密钥即可窃取所有数据。如果有更多的键,如果一个键已知,则只有部分数据是危险的。一次pad encryption是唯一不能基于统计分析解密的加密。在该算法中,密钥的每一位只使用一次。