为登记生成密钥的不同方法有哪些

时间:2015-06-05 16:59:18

标签: php encryption aes symmetric-key

我正在使用带有php的aes256来加密数据 在各种文档中,我看到了生成密钥的各种方法,如:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

$Key = "what ever, plain string";

或者

$Key = "123456789abcdef";//128bit

第一个例子的重点是什么,与其他例子相反? 为什么不简单地使用128或256长的随机字符串?

我在这里使用http://php.net/manual/en/function.mcrypt-encrypt.php示例,其中包含上述每种不同的密钥生成方法。

1 个答案:

答案 0 :(得分:0)

您有三种不同的密钥长度。 AES指定用于以下三个密钥长度:128位(16字节),192位(24字节)和256位(32字节)。我不打算详细介绍不同密钥尺寸的强弱。

让他们分开:

$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");

这是一个十六进制编码,编码形式为64个字符。密钥本身长度为32个字节,这意味着当密钥传递给mcrypt_encrypt()时,AES-256会自动使用。

$Key = "what ever, plain string";

这是一个23个字符的字符串,可用作5.6.0之前的PHP版本的密钥。这不是AES中密钥的有效长度。 MCrypt将使用\0填充密钥,直至下一个有效密钥大小,即AES-192为24字节。所以这个密钥实际上是这种形式的PHP 5.6的有效密钥:

$Key = "what ever, plain string\0";
$Key = "123456789abcdef"; //128bit

这是一个15个字符"键"。与前面的示例一样,它将被填充到16个字节,以便使用AES-128。

生成密钥

由于您询问密钥生成,this question包含一些方法。密钥应该是随机的,包含所有可能的字节。如果您想要安全地防止对您的密钥进行强力攻击,那么使用仅包含字母数字或仅包含可打印字符的密钥并不好。

由于不可能将任意字节直接硬编码为代码文件中的密钥,因此您应该使用第一种方法对密钥的编码版本进行硬编码并以编程方式对其进行解码。

使用硬编码密钥

只有极少数情况可以使用代码中的对称密钥进行硬编码:

  • 测试加密实现(在开发期间)
  • 静态加密数据,其中数据与加密密钥不在同一台机器上(否则,它只是数据混淆)

如果您的方案与上述方案不匹配,您或者对模糊处理感到满意,或者您应该考虑如何使用混合加密方法来使用公钥加密。