小编典典

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

all

我计划在我的网站上为我的用户存储外国帐户信息,即 rapidshare
用户名和密码等…我想保证信息的安全,但我知道如果我对他们的信息进行哈希处理,我将无法检索它以供以后使用.

Base64
是可解密的,所以直接使用它是没有意义的。我的想法是扰乱用户并在它以这种方式进行base64化之前和之后通过,即使在你解密它之后,如果你尝试解密,你会得到一些看起来很有趣的文本。是否有一个接受值的
php 函数,该值将对字符串进行唯一的加扰,并在稍后重新输入值时对其进行解扰?

有什么建议么?


阅读 72

收藏
2022-06-16

共1个答案

小编典典

您不应加密密码,而应使用 bcrypt 之类的算法对密码进行哈希处理。 这个答案解释了如何在 PHP
中正确实现密码散列
不过,这里是你将如何加密/解密:

$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 "
2022-06-16