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

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

我计划在我的网站上为我的用户存储外部帐户信息,也就是rapidshare用户名和密码等等。我想保证信息的安全,但我知道如果我散列他们的信息,我无法检索它以备后用。

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
    ),
    ""
);

警告 :上述示例加密信息,但它不验证密文以防篡改。 您不应该依赖未经身份验证的加密安全性,特别是因为所提供的代码易受填充Oracle攻击的影响。

也可以看看:

  • https://stackoverflow.com/a/30189841/2224584
  • https://stackoverflow.com/a/30166085/2224584
  • https://stackoverflow.com/a/30159120/2224584
  • 另外,不要只为密钥使用“密码”。 加密密钥是随机字符串。


    在3v4l.org演示:

    echo 'Encrypted:' . "n";
    var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="
    
    echo "n";
    
    echo 'Decrypted:' . "n";
    var_dump($decrypted); // " string to be encrypted "
    

    安全警告 :这个班级不安全。 它使用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";
    

    安全警告:此代码不安全。

    工作示例

    define('SALT', 'whateveryouwant'); 
    
    function encrypt($text) 
    { 
        return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
    } 
    
    function decrypt($text) 
    { 
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
    } 
    
    $encryptedmessage = encrypt("your message"); 
    echo decrypt($encryptedmessage); 
    
    链接地址: http://www.djcxy.com/p/28937.html

    上一篇: Best way to use PHP to encrypt and decrypt passwords?

    下一篇: Update old stored md5 passwords in PHP to increase security