在 C# 中创建我的对称密钥
Creating My Symmetric Key in C#
一直在审查一些对称加密方法我已经看到了很多在 class 中对私有静态变量进行硬编码的示例,通常类似于:
string key = "THISISYOURENCRYPTIONKEY!"
然后再往下的某个地方,代码将它用于 encrypting/decrypting。
抛开正确的 implementation/algorithm/strategy 以及存储位置不谈,我有一个简单的问题。 我的密钥的值应该是多少? 即我如何生成它?我看到的大多数示例要么使用他们刚刚组成的一些随机句子,要么使用 .net class 生成一个字节数组,该字节数组具有 returns byte[] 的加密安全随机数生成器。我用它 byte[] 做什么?我假设它不应该是一个字节数组,而是一个我可以保存在某个地方的实际字符串(可能不在我的 class 的顶部)。
有人可以为我澄清一些基础知识吗?
谢谢!
对于对称加密算法,大多数情况下需要二进制数组作为密钥。它提出了以下问题:
- 如何获取密钥的二进制数据?
密钥应该是随机的。如果不是随机的,就更容易被别人揣摩出来。不幸的是,由计算机生成随机数并不是那么简单。简单的随机生成算法是循环的,周期很短,所以很容易找到用于key的段。有时他们试图从现实世界中获取一些输入作为参数来生成随机数,例如时间(可预测,不安全)来自硬盘驱动器的一些数据,来自网络的数据,让用户输入一些东西等等。这些是或多或少可以预见的事情。也可以购买为此目的而设计的设备,这些设备具有强大的算法和存储良好的种子值,或者它们具有某种粒子检测器,因为这些粒子会随机撞击设备。重点是,如果可以的话,key一定是不可预测的。
- 您需要存储密钥吗?
在对称加密的情况下,加密和解密使用相同的密钥。因此,如果要解密数据,则必须至少第二次使用密钥 - 因此必须以某种方式保留它。保留密钥是危险的,因为其他人可能会得到它。将密钥保存到硬盘驱动器?它适用于非常简单的系统,但很容易找到密钥。 Windows提供了key storage providers,还有很多实现方式。简单的实现将密钥存储在硬盘上,但它是用另一个密钥加密的——当然密钥存储在硬盘上,否则 windows 将无法为您解密密钥。可以以在引导期间获取 "main" 密钥的方式设置系统,因此管理员必须键入它,然后密钥存储在内存中 - 但管理员必须记住 "main key",也许它被写在他钱包里的一张纸上 :) 您也可以购买专为存储密钥而设计的设备,这些设备具有非常复杂的机制来安全地存储密钥,使用专为执行此操作而设计的芯片。这些设备通常可以执行 encryption/decryption,因此密钥不必离开设备 - 只有当它必须共享时,这在对称算法的情况下是不可避免的。所以这是一个很大的话题,一个人可以花一大笔钱来保护密钥,其他人只是乐于使用 Windows 密钥存储。
人们记不住32字节的六边形数组,这也是发明密钥推导算法的原因之一。这些获取输入文本并从中生成伪随机数据。当然,此数据不如真正的随机密钥安全。您可以在 .net 中使用 rfc2898derivebytes。
- 您需要多次使用密钥吗?
这取决于您的使用情况,但最好避免多次使用同一个密钥。通信协议在握手期间就新的对称密钥达成一致,并在一段时间后更改密钥,即使它们仍然处于连接状态。这是因为长时间使用密钥意味着密钥存在时间更长(意味着窃取它的时间更长)并产生更多数据,这些数据是分析它并尝试找出密钥的良好输入。此外,如果您使用单个密钥加密所有内容,那么获取单个密钥就足以窃取所有数据。如果有更多的密钥,如果密钥被知道,只有部分数据是危险的。一次pad encryption是唯一一种根据统计分析无法解密的加密。在该算法中,密钥的每一位仅使用一次。
一直在审查一些对称加密方法我已经看到了很多在 class 中对私有静态变量进行硬编码的示例,通常类似于:
string key = "THISISYOURENCRYPTIONKEY!"
然后再往下的某个地方,代码将它用于 encrypting/decrypting。
抛开正确的 implementation/algorithm/strategy 以及存储位置不谈,我有一个简单的问题。 我的密钥的值应该是多少? 即我如何生成它?我看到的大多数示例要么使用他们刚刚组成的一些随机句子,要么使用 .net class 生成一个字节数组,该字节数组具有 returns byte[] 的加密安全随机数生成器。我用它 byte[] 做什么?我假设它不应该是一个字节数组,而是一个我可以保存在某个地方的实际字符串(可能不在我的 class 的顶部)。
有人可以为我澄清一些基础知识吗?
谢谢!
对于对称加密算法,大多数情况下需要二进制数组作为密钥。它提出了以下问题:
- 如何获取密钥的二进制数据?
密钥应该是随机的。如果不是随机的,就更容易被别人揣摩出来。不幸的是,由计算机生成随机数并不是那么简单。简单的随机生成算法是循环的,周期很短,所以很容易找到用于key的段。有时他们试图从现实世界中获取一些输入作为参数来生成随机数,例如时间(可预测,不安全)来自硬盘驱动器的一些数据,来自网络的数据,让用户输入一些东西等等。这些是或多或少可以预见的事情。也可以购买为此目的而设计的设备,这些设备具有强大的算法和存储良好的种子值,或者它们具有某种粒子检测器,因为这些粒子会随机撞击设备。重点是,如果可以的话,key一定是不可预测的。
- 您需要存储密钥吗?
在对称加密的情况下,加密和解密使用相同的密钥。因此,如果要解密数据,则必须至少第二次使用密钥 - 因此必须以某种方式保留它。保留密钥是危险的,因为其他人可能会得到它。将密钥保存到硬盘驱动器?它适用于非常简单的系统,但很容易找到密钥。 Windows提供了key storage providers,还有很多实现方式。简单的实现将密钥存储在硬盘上,但它是用另一个密钥加密的——当然密钥存储在硬盘上,否则 windows 将无法为您解密密钥。可以以在引导期间获取 "main" 密钥的方式设置系统,因此管理员必须键入它,然后密钥存储在内存中 - 但管理员必须记住 "main key",也许它被写在他钱包里的一张纸上 :) 您也可以购买专为存储密钥而设计的设备,这些设备具有非常复杂的机制来安全地存储密钥,使用专为执行此操作而设计的芯片。这些设备通常可以执行 encryption/decryption,因此密钥不必离开设备 - 只有当它必须共享时,这在对称算法的情况下是不可避免的。所以这是一个很大的话题,一个人可以花一大笔钱来保护密钥,其他人只是乐于使用 Windows 密钥存储。
人们记不住32字节的六边形数组,这也是发明密钥推导算法的原因之一。这些获取输入文本并从中生成伪随机数据。当然,此数据不如真正的随机密钥安全。您可以在 .net 中使用 rfc2898derivebytes。
- 您需要多次使用密钥吗?
这取决于您的使用情况,但最好避免多次使用同一个密钥。通信协议在握手期间就新的对称密钥达成一致,并在一段时间后更改密钥,即使它们仍然处于连接状态。这是因为长时间使用密钥意味着密钥存在时间更长(意味着窃取它的时间更长)并产生更多数据,这些数据是分析它并尝试找出密钥的良好输入。此外,如果您使用单个密钥加密所有内容,那么获取单个密钥就足以窃取所有数据。如果有更多的密钥,如果密钥被知道,只有部分数据是危险的。一次pad encryption是唯一一种根据统计分析无法解密的加密。在该算法中,密钥的每一位仅使用一次。