Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 无法解密密码_Php_Encryption Symmetric - Fatal编程技术网

Php 无法解密密码

Php 无法解密密码,php,encryption-symmetric,Php,Encryption Symmetric,我最近决定使用一个更安全的加密软件作为我的密码。在调用mc\u encrypt($encrypt)方法返回加密密码后,我对加密密码没有问题 当通过调用mc_decrypt($decrypt)进行解密时,该方法返回false。正如您在mc_decrypt($decrypt)方法中所看到的,在底部附近有一个if语句。我无法使if语句通过。有人知道我可以更改什么来获得$calcmac==$mac是否返回真值?谢谢 <?php class Encrypt { public $en

我最近决定使用一个更安全的加密软件作为我的密码。在调用
mc\u encrypt($encrypt)
方法返回加密密码后,我对加密密码没有问题

当通过调用
mc_decrypt($decrypt)
进行解密时,该方法返回false。正如您在
mc_decrypt($decrypt)
方法中所看到的,在底部附近有一个if语句。我无法使if语句通过。有人知道我可以更改什么来获得
$calcmac==$mac
是否返回真值?谢谢

<?php

    class Encrypt {
    public $encryptionKey = 'xxxxxxx';

    public function __construct() {
    define('ENCRYPTION_KEY', $this->encryptionKey);
    }

    // Encrypt Function
    public function mc_encrypt($encrypt){
        $encrypt = serialize($encrypt);
        $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
        $key = pack('H*', $this->encryptionKey);
        $mac = hash_hmac('sha256', $encrypt, substr(bin2hex($key), -32));
        $passcrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $encrypt.$mac, MCRYPT_MODE_CBC, $iv);
        $encoded = base64_encode($passcrypt).'|'.base64_encode($iv);
        return $encoded;
    }

    // Decrypt Function
    public function mc_decrypt($decrypt){
        $decrypt = explode('|', $decrypt);
        $decoded = base64_decode($decrypt[0]);
        $iv = base64_decode($decrypt[1]);
        $key = pack('H*', $this->encryptionKey);
        $decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $decoded, MCRYPT_MODE_CBC, $iv));
        $mac = substr($decrypted, -64);
        $decrypted = substr($decrypted, 0, -64);
        $calcmac = hash_hmac('sha256', $decrypted, substr(bin2hex($key), -32));
        if($calcmac!==$mac){ return false; }
        $decrypted = unserialize($decrypted);
        return $decrypted;
    }

    }

    ?>

密码不应依赖双向加密。如果有人能得到密码,他们通常也能得到解密密码的密钥

相反,您应该使用散列或键派生,如blowfish或pbkdf2,这些是设计为难以破解的单向函数

请不要用这种方式加密密码

抱歉,正在使用服务器上存储的密码加密密码 不安全:如果入侵者闯入您的代码库,入侵者可以检索 使用您的代码库和存储的密码的每个和任何密码 (代码或持久存储中的某个地方)

,提供准备充分的文件:,和。看一看

要走的路是一条路

如何处理新创建的密码

  • 如果创建新密码,请使用随机salt计算
    hash=HashFunction(password,salt)
  • 将散列和盐保存在数据库中,并与用户ID一起保存
如何验证密码

  • 在数据库中找到用户ID的记录
  • 从记录中检索哈希和salt
  • 根据用户输入的密码登录,计算
    hash=HashFunction(enteredPassword,salt)
  • 最后,验证从存储中检索的哈希值是否与计算的哈希值相同
为什么要使用哈希操作?

散列操作就是所谓的:虽然可以轻松地计算函数,但计算反向函数却很难。 推论:从密码计算密码散列很容易,但从密码散列计算密码很难

PHP的哈希函数

现在,PHP是密码哈希的首选

如果您的PHP安装太旧,即使是带有
md5()
的盐哈希也比两个加密密码好但只有在绝对没有其他可用的情况下

PBKDF2使用示例

function getHashAndSaltFromString( $password ) {

   // choose a sufficiently long number of iterations 
   // ... to make the operation COSTLY
   $iterations = 1000;

   // Generate a random IV using mcrypt_create_iv(),
   // openssl_random_pseudo_bytes() or another suitable source of randomness
   $salt = mcrypt_create_iv(16, MCRYPT_DEV_RANDOM);

   $hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);

   return array( $hash, $salt );

}
哈希用法的美丽副作用

function getHashAndSaltFromString( $password ) {

   // choose a sufficiently long number of iterations 
   // ... to make the operation COSTLY
   $iterations = 1000;

   // Generate a random IV using mcrypt_create_iv(),
   // openssl_random_pseudo_bytes() or another suitable source of randomness
   $salt = mcrypt_create_iv(16, MCRYPT_DEV_RANDOM);

   $hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20);

   return array( $hash, $salt );

}
许多网站确实将密码的长度限制在一定的长度内——很可能是由于底层持久存储的长度[=数据库表中字段的长度]

如果使用基于散列的密码存储技术,您的用户可能会使用任意长度的密码

因为散列的长度是恒定的,所以您只需要保存密码和密码 盐,长度限制是多余的支持web应用中的长密码

在极端情况下,您甚至可以允许用户上传一个文件(例如他们家的照片)作为凭证[=密码]

PHP的MCRYPT函数中随机源的旁注

请注意,PHP确实提供了两种随机性源
MCRYPT\u DEV\u RANDOM
MCRYPT\u DEV\u URANDOM

  • MCRYPT\u DEV\u RANDOM
    /DEV/RANDOM
  • MCRYPT\u DEV\u uradom
    /DEV/uradom
/dev/urandom
在每次查询时立即提供随机数据且不阻塞,
/dev/random
可能会阻塞(需要一些时间才能返回)

因此,乍一看,
/dev/uradom
MCRYPT\u dev\u uradom
可能更适合生成随机数事实上,它不是

/dev/random
可能会在某个时间点阻止请求,此时已收集了足够多的数据。因此,
/dev/random
MCRYPT\u dev\u random
有效地收集了随机性

如果需要执行强加密操作,请使用
MCRYPT\u DEV\u RANDOM
/dev/random


如果您使用的是PHP>=5.3.7,那么您应该使用password_comp库,该库是由参与PHP的人员编写的,它利用了BCRYPT,这是迄今为止PHP可用的最强大的算法

它非常简单,易于使用

简单地散列密码

 $hash = password_hash($password, PASSWORD_BCRYPT);
根据存储的密码哈希值验证给定的密码

if (password_verify($password, $hash)) {
    /* Valid */
} else {
    /* Invalid */
}

非常简单的东西,比如他们说不需要重写was已经写好了,特别是在安全方面,并且是由专家编写的。

谢谢,我会研究其他类型。太好了,谢谢你的好建议!我将研究如何使用PBKDF2 hash.salt,包括签出行51-142。不,它是可选的,$hash=password\u hash($password,password\u BCRYPT,array(“cost”=>10));与$hash=password\u hash($password,password\u BCRYPT)相同;因为这是默认设置。