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();
    }
}

と をエコーする$pass$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:
//ulgin.sourceforge.net/を参照してください。

こちらもチェックしてください:
PHP、MCrypt、Rijndael-256、および CBC で高度に安全なデータ暗号化と復号化を簡単に

幸運を。

于 2013-08-10T20:24:33.523 に答える