【问题标题】:Using mcrypt for password encryption in php在 php 中使用 mcrypt 进行密码加密
【发布时间】:2014-07-26 14:31:13
【问题描述】:

我想知道我可以使用这个加密解密脚本进行密码加密并将其放入数据库吗? 什么将是 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;
}
?>

【问题讨论】:

  • 一些注意事项:如果你只是想验证密码,你不应该存储密码根本,甚至不加密;例如,阅读this。您将在哪里存储加密/解密密钥?其他注意事项:您使用的不是 AES,而是块大小为 256 的 Rijndael。否则加密似乎没问题,即使它使用 MAC-then-encrypt 而不是 encrypt-then-MAC。
  • 请注意,密钥处理非常奇怪,似乎您可以给它一个 48 字节的密钥,并让加密密钥具有前 32 个字节,而 HMAC 密钥具有最后 16 个字节。但是如果你在两者之间给它任何东西,键就会重叠。确保您了解密钥处理,否则您以后可能无法解密。
  • @owlstead。谢谢你的回答。你提供的链接真的很有帮助..
  • 另请注意,存在一个名为 codereview 的站点。
  • 请注意,您应该始终尝试包含语言标签。

标签: php encryption passwords mcrypt


【解决方案1】:

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

请注意,加密不使用 AES,而是使用 256 位 block 大小的 Rijndael。另请注意,密钥处理不是最理想的,在密钥参数方面很容易出错。否则代码看起来不错乍一看

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 2012-11-06
    • 2015-11-10
    • 2011-01-31
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 2013-12-28
    • 2012-04-11
    相关资源
    最近更新 更多