在php中使用mcrypt进行密码加密

时间:2014-07-26 14:31:14

标签: php encryption passwords mcrypt

我想知道我可以使用此加密解密脚本进行密码加密并将其放入数据库吗? 什么是sql表密码列结构(目前它是password varchar(32)NOT NULL)。 请注意,此脚本使用32字节十六进制密钥作为加密密钥。

<?php

define('ENCRYPTION_KEY', '32-byte hexadecimal encryption key');

function mc_encrypt($encrypt, $key)
{
  $encrypt = serialize($encrypt);
  $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM);
  $key = pack('H*', $key);
  $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;
}

function mc_decrypt($decrypt, $key)
{
  $decrypt = explode('|', $decrypt);
  $decoded = base64_decode($decrypt[0]);
  $iv = base64_decode($decrypt[1]);
  if(strlen($iv)!==mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC)){ return false; }
  $key = pack('H*', $key);
  $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;
}
?>

1 个答案:

答案 0 :(得分:0)

除非严格要求(即处理旧协议),否则不应使用存储密码(加密或不加密)。而是使用基于PBKDF的密码哈希函数,如PBKDF2,bcrypt或scrypt。

请注意,加密不使用AES,而是使用大小为256位的Rijndael。还要注意,密钥处理不是最理想的,关键参数容易出错。否则,代码看起来很好乍一看