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

2022-08-30 06:19:08

可能的重复:
PHP双向加密:我需要存储可以检索的密码

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

Base64是可解密的,所以没有必要简单地使用它。我的想法是扰乱用户,并在它以这种方式获得base64ed之前和之后通过,即使你解密了它,如果你试图解密它,你会得到一些有趣的文本。有没有一个php函数可以接受一些值,这些值将对字符串进行唯一的加扰,并在以后重新输入该值时对其进行取消加扰?

有什么建议吗?


答案 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 "

答案 2

安全警告:此类不安全。它使用的是Rijndael256-ECB,这在语义上是不安全的。仅仅因为“它有效”并不意味着“它是安全的”。此外,由于没有使用适当的填充,它随后会剥离尾随空间。

最近发现这个课程,它像梦一样工作!

class Encryption {
    var $skey = "yourSecretKey"; // you can change it

    public  function safe_b64encode($string) {
        $data = base64_encode($string);
        $data = str_replace(array('+','/','='),array('-','_',''),$data);
        return $data;
    }

    public function safe_b64decode($string) {
        $data = str_replace(array('-','_'),array('+','/'),$string);
        $mod4 = strlen($data) % 4;
        if ($mod4) {
            $data .= substr('====', $mod4);
        }
        return base64_decode($data);
    }

    public  function encode($value){ 
        if(!$value){return false;}
        $text = $value;
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv);
        return trim($this->safe_b64encode($crypttext)); 
    }

    public function decode($value){
        if(!$value){return false;}
        $crypttext = $this->safe_b64decode($value); 
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv);
        return trim($decrypttext);
    }
}

并称之为:

$str = "My secret String";

$converter = new Encryption;
$encoded = $converter->encode($str );
$decoded = $converter->decode($encoded);    

echo "$encoded<p>$decoded";

推荐