Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php在数据库中使用密钥加密解密_Php_Database_Encryption - Fatal编程技术网

php在数据库中使用密钥加密解密

php在数据库中使用密钥加密解密,php,database,encryption,Php,Database,Encryption,我只是尝试将加密的电子邮件地址和加密密钥存储在数据库中的两个单独字段中,然后在不同的页面上解密。有时它有效,但大多数情况下不起作用 function encrypt($string, $key){ $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); return $encrypted; } func

我只是尝试将加密的电子邮件地址和加密密钥存储在数据库中的两个单独字段中,然后在不同的页面上解密。有时它有效,但大多数情况下不起作用

function encrypt($string, $key){
    $encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
    return $encrypted;
}
function decrypt($string, $key){
    $decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
    return $decrypted;
}
我试着将我的键域从varchar改为varbinary,但似乎没有什么不同。 我有一个时间表,所以所有的想法都是受欢迎的 编辑:以下是我的代码片段 index.php

    $mysqli = new mysqli(DBHOST, DBUSER, DBPASSWORD, DB);
// $crypter = new Crypter();
if($mysqli->connect_errno){
    echo "Failed to connect to MYSQL (".$mysqli->connect_errno.")".$mysqli->connect_error;
}
//construct string and mail to email
$email = trim($_POST['signUpEmail']);
$encryption_key = substr(md5(microtime()), 0,10);

//insert details into table
$password = $_POST['signUpPassword'];
$hashed_password = encrypt_password($password);
$stmt = $mysqli->prepare('INSERT INTO signup (username, hashed_password, enc_key) VALUES (?,?,?)');
$stmt->bind_param("sss", $email, $hashed_password, $encryption_key);
if($stmt->execute()){
    $encrypted_email = encrypt($email, $encryption_key);

    $row = $stmt->insert_id;
    //encrypting the row num
    $enc_row = mc_encrypt($row, '000');
    $link = "signup/signuser.php?u=".$enc_row."&&e=".$encrypted_email;
    echo 'mail link <a href="'.$link.'">'.$link.'</a>'."<br />";

有一个AES加密类, 可以这样使用:

function crypt_data($content, $encrypt) {
    include_once ('AES.class.php');
    $_content = "";
    if (!empty($content)) {
        $key256 = '603deb1015ca71be2b73aef0857d77811f352c073b6108d72d9810a30914dff4';
        $Cipher = new AES(AES::AES256);

        if ($encrypt) {
            $_content = $Cipher->encrypt($Cipher->stringToHex($content), $key256);    
        } else {
            $_content = $Cipher->hexToString($Cipher->decrypt($content, $key256));    
        }
    }

    return $_content;
}
然后像这样使用它:

$encrypted = crypt_data($string_to_encrypt, true);
$decrypted = crypt_data($string_to_decrypt, false);

如果你知道它有时有效,有时无效,你必须能够给我们一些例子,说明它何时有效,何时无效。我刚刚用一百万个随机字符串和密钥运行了一个测试,与$str==decryptencrypt$str,$key,$key相比,它甚至没有失败一次。我怀疑问题出在公布的代码中。
$encrypted = crypt_data($string_to_encrypt, true);
$decrypted = crypt_data($string_to_decrypt, false);