我正在使用RIJNDAEL加密/解密密码和其他一些字符串,但它不起作用。
这是我的加密/解密功能:
function secreto($accion,$clave,$palabra) {
//SETEO DATA EN 0 PORSIACA
$data = 0;
//INICIALIZO EL VECTOR
$iv = md5($clave);
//SI TENGO QUE ENCRIPTAR
if($accion == 'encripta') {
$data = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $clave, $palabra, MCRYPT_MODE_CBC, $iv);
$data = base64_encode($data);
} elseif($accion == 'decripta') {
$data = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $clave, base64_decode($palabra), MCRYPT_MODE_CBC, $iv);
$data = rtrim($data, "");
}
return $data;
}
以下是我用来登录用户的相关部分:
session_start();
if(isset($_SESSION['usuario']) && isset($_SESSION['domadmin']) && isset($_SESSION['superadmin'])) {
$usuario = $_SESSION['usuario'];
$tipoadmin = $_SESSION['tipoadmin'];
if(isset($_GET['p'])) { $p = $_GET['p']; } else { $p = "resumen"; }
echo TPcabecera();
echo TPmenu($p);
echo TPcentral($p);
echo TPpie();
} else {
if(isset($_POST['usuario']) && isset($_POST['password'])) {
$post_usr = mysqli_real_escape_string(sqls("mail"), $_POST['usuario']);
$post_pwd = mysqli_real_escape_string(sqls("mail"), $_POST['password']);
$data = sql("mail", "SELECT email,superadmin,domadmin,syspass FROM users WHERE email = '".$post_usr."'");
if(mysqli_num_rows($data) == 0) {
echo TPlogin();
} else {
$row = mysqli_fetch_assoc($data);
$pass = secreto('decripta',$passsalt,$row['syspass']);
if($post_pwd == $pass) {
$usuario = $row['email'];
if($row['superadmin'] == '1') { $tipoadmin = 'superadmin'; } elseif($_SESSION['domadmin'] != '0') { $tipoadmin = $_SESSION['domadmin']; } else { $tipoadmin = '0'; }
if(isset($_GET['p'])) { $p = $_GET['p']; } else { $p = "resumen"; }
echo TPcabecera();
echo TPmenu($p);
echo TPcentral($p);
echo TPpie();
} else {
echo TPlogin();
}
}
} else {
echo TPlogin();
}
}
如果我回显$pass
和$post_pwd
,它们完全相同,但if($post_pwd == $pass)
没有验证。。。我使用加密的方式不对吗?
您的secreto
函数应该"工作"。使用您的登录代码,我看不出您在哪里初始化$passsalt
。因此,要么您的代码中有一部分没有显示,要么$passsalt
实际上没有设置。
您的加密不安全:
-
您不应该使用密码作为加密密钥。人工密码通常没有足够的熵。
-
你使用散列版本的密钥作为你的IV.,这在一定程度上暴露了你的密钥
-
IV旨在通过"随机化"第一个加密块来保护您的密钥。这样可以确保即使使用相同的密钥加密相同的文本,输出也会有所不同。因为你使用恒定的IV,你不会从中得到任何好处
如果可能的话,你的密钥应该是随机的,使用0-255的字符范围。加密时,您的IV必须始终不同。IV可以是公共的,所以您甚至可以将其与加密文本一起存储。
您还应该避免将加密密钥与加密数据一起存储在数据库中。
如果你正在加密密码,我会使用为密码设计的单向哈希,比如scrypt或bcrypt。
这是我想添加的内容:
组织您的代码时要考虑到关注点的分离,所以在单独的小步骤中执行每个任务。这将帮助您编写更清晰的代码,并保持其干燥。
我建议将编码/解码部分放入单独的函数中。例如:
<?php
// Encrypt function
function mc_encrypt($encrypt, $mc_key)
{
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$passcrypt = trim(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($encrypt), MCRYPT_MODE_ECB, $iv));
$encode = base64_encode($passcrypt);
return $encode;
}
// Decrypt function
function mc_decrypt($decrypt, $mc_key)
{
$decoded = base64_decode($decrypt);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND);
$decrypted = trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $mc_key, trim($decoded), MCRYPT_MODE_ECB, $iv));
return $decrypted;
}
这样你就可以直接打电话给他们。
对于身份验证,请查看以下内容:
http://ulogin.sourceforge.net/
另请查看:
高度安全的数据加密&使用PHP、MCrypt、Rijndael-256和CBC 轻松解密
祝你好运。