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