如何在PHP中扩展用户加密密码?

时间:2016-05-27 22:40:31

标签: php encryption passwords symmetric-key

我以为我理解了这一点,但我的程序不会解密并且说密钥错了,所以我意识到我需要帮助。我以为算法去了:

加密:

  1. 获取用户密码P
  2. 调用hash_pbkdf2将P拉伸为密钥K_pass_1
  3. 调用另一个键拉伸算法(我不知道哪个,尚未完成此操作)将K_pass_1转换为K_auth_1
  4. 使用 K_auth_1 K_pass_1
  5. 加密数据

    解密:

    1. 获取用户密码P
    2. 调用hash_pbkdf2将P拉伸为密钥K_pass_2
    3. 如上
    4. 使用 K_auth_2 K_pass_2
    5. 解密数据

      这不正确吗? (编辑:事实证明是这样,但是这个级别太高了 - 我的问题更具体。)

      编辑:这是我的代码:

      sudo ~/torch/install/bin/luarocks install nn

3 个答案:

答案 0 :(得分:3)

问题在于功能:

function generate_key_from_password($password)

行:

$salt = openssl_random_pseudo_bytes($GLOBALS['key_size'], $strong);

需要使用相同的盐才能获得相同的密钥。

需要在generate_key_from_password函数之外创建一个salt并传入,并且它需要与加密和解密相同的salt。这通常通过在加密函数中创建salt,将其传递到PBKDF2函数并以与iv相同的方式将salt预先加到加密输出中来完成。然后,相同的盐可用于解密功能。​​

这样的小事使安全使用加密变得困难。有关包含身份验证,迭代计数和版本的示例,请参阅RNCryptor-phpRNCryptor-Spec

答案 1 :(得分:1)

跳过第3步,没有必要。

确保键和iv的长度正确。确保您使用的是CBC模式和PKCS#7(或PKCS#5)。

答案 2 :(得分:1)

hash_pbkdf2()使用可选的第五个参数$length

var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100));
// string(64) "5d808ee6539c7d0437e857a586c844900bf0969d1af70aea4c3848550d9038ab"

var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100, 32));
// string(32) "5d808ee6539c7d0437e857a586c84490"

var_dump(hash_pbkdf2("sha256", "foobar", "salty", 100, 128));
// string(128) "5d808ee6539c7d0437e857a586c844900bf0969d1af70aea4c3848550d9038abb2853bf0cf24c9d010555394f958fa647a04b232f993c35916977b4ef5a57dcc"

您可能还需要原始输出,因此请阅读上面链接的方法文档页面,并注意这一点。