一尘不染

使用PHP加密和解密密码的最佳方法?

php

我计划在我的网站上为我的用户存储外国帐户信息,也称为RapidShare用户名和密码等。我想确保信息的安全,但是我知道,如果我对他们的信息进行哈希处理,我将无法将其检索以备后用。

Base64可以解密,因此毫无意义地使用它。我的想法是对用户进行加扰,即使在解密之后,也要以这种方式传递base64前后,如果尝试解密,则会得到一些看上去很有趣的文本。是否有一个php函数接受可以对字符串进行唯一加扰的值,并在以后重新输入值时对其进行加扰?

有什么建议么?


阅读 513

收藏
2020-05-26

共1个答案

一尘不染

**您不应加密密码,而应使用bcrypt之类的算法对密码进行哈希处理。不过,这是加密/解密的方法:

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

加密:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

解密:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

警告 :上面的示例对信息进行加密,但不对密文进行身份验证以防止篡改。你应该
依赖于安全性未经验证的加密所提供易受填充神谕攻击以来,特别是代码。

另外,不要只对加密密钥使用“密码”。 加密密钥是随机字符串。


3v4l.org上的演示:

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "
2020-05-26