我计划在我的网站上为我的用户存储外国帐户信息,即 rapidshare 用户名和密码等…我想保证信息的安全,但我知道如果我对他们的信息进行哈希处理,我将无法检索它以供以后使用.
Base64 是可解密的,所以直接使用它是没有意义的。我的想法是扰乱用户并在它以这种方式进行base64化之前和之后通过,即使在你解密它之后,如果你尝试解密,你会得到一些看起来很有趣的文本。是否有一个接受值的 php 函数,该值将对字符串进行唯一的加扰,并在稍后重新输入值时对其进行解扰?
有什么建议么?
您不应加密密码,而应使用 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 "