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)
- 最后,验证从存储中检索的哈希值是否与计算的哈希值相同
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)相同;因为这是默认设置。