0

我正在使用 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();
    }
}

如果我回显$passand $post_pwd,它们完全相同,但if($post_pwd == $pass)不验证...我是否以错误的方式使用加密?

4

2 回答 2

2

你的secreto功能应该“工作”。使用您的登录代码,我看不到您在哪里初始化$passsalt。因此,要么有一部分代码没有显示,要么$passsalt实际上没有设置。

但是,您的加密不安全:

  1. 您不应该使用密码作为您的加密密钥。人类密码通常没有足够的

  2. 通过使用它的散列版本作为您的 IV,您在某种程度上暴露了您的密钥。

  3. IV 旨在通过“随机化”第一个加密块来保护您的密钥。这样可以确保即使您使用相同的密钥加密相同的文本,输出也会有所不同。因为您使用恒定的 IV,所以您不会从中获得任何好处。

如果可能,您的密钥应该是随机的,使用 0 - 255 的字符范围。加密时您的 IV 必须始终不同。IV 可以是公开的,因此您甚至可以将其与加密文本一起存储。

您还应该避免将加密密钥与加密数据一起存储在数据库中。

如果您要加密密码,我会使用专为密码设计的单向哈希,例如scryptbcrypt

于 2013-08-10T19:56:39.750 回答
0

这是我想补充的:

考虑分离关注点来组织您的代码,因此在小的单独步骤中执行每个任务。这将帮助您编写更清晰的代码并保持DRY

我建议将编码/解码部分放入单独的函数中。例如:

<?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 轻松实现高度安全的数据加密和解密

祝你好运。

于 2013-08-10T20:24:33.523 回答