1

我的网站是在 Wordpress 中构建的,我们正在收集需要放入数据库中的个人信息。到目前为止,这是我的 php 插入:

//defined in wp-config.php
$key = KEY_ENCRYPT;

function encrypt($text) 
{   
    return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); 
} 


if($_POST){ 
    //POST object placed in variables
    $user_domain = $_POST['domain'];
    $s_user = $_POST['s-username'];
    $s_pass = $_POST['s-password'];
    $w_user = $_POST['w-username'];
    $w_pass = $_POST['w-password'];

    //encrypting data
    $encrypted_server_username = encrypt($s_user); 
    $encrypted_server_password = encrypt($s_pass);
    $encrypted_wordpress_username = encrypt($w_user); 
    $encrypted_wordpress_password = encrypt($w_pass);

    //set up array for options table
    $user_website_data = array(
        'domain'=>$user_domain,
        'server_username'=>$encrypted_server_username,
        'server_password'=>$encrypted_server_password,
        'wordpress_username'=>$encrypted_wordpress_username,
        'wordpress_password'=>$encrypted_wordpress_password
        );  

        update_option($user_domain . '_website_data', $user_website_data);

此代码成功地将信息存储在一个数组中。您甚至可以在http://thewpvalet.staging.wpengine.com/sign-up/?plan=basic上查看此代码的工作和流程。请使用 4242424242424242 作为 CC 号进行测试。

现在我正在尝试在后端管理区域实现解码,以便我可以按域搜索并提取凭据。这是我的代码:

if(isset($_POST['domain'])){
        function decrypt($text) 
        {
            $key = KEY_ENCRYPT;

            return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)));
        }


        $search_domain = $_POST['domain'];
        $url_removal = array("http://","www.");
        $clean_search_domain = str_replace($url_removal, '', $search_domain);
        $user_options = get_option($search_domain.'_website_data');

        echo '<strong>Login Information:</strong></br>' .
        'Domain:' . $user_options['domain'] . '</br>' .
        'Server Username:' . decrypt($user_options['server_username']) . '</br>';

    }

这将返回 mcrypt_decrypt() [function.mcrypt-decrypt]: Size of key is too large for this algorithm in /nas/wp/www/staging/thewpvalet/wp-content/plugins/user-info/index.php 第 43 行

知道我在这里做错了什么吗?

4

1 回答 1

4

知道我在这里做错了什么吗?

是的,您做错的事情是滚动您自己的密码学。让我们添加一些空格并详细查看您的函数:

/**
 * THIS CODE IS INSECURE. DO NOT USE IT. PURGE IT FROM YOUR CODEBASE!
 */
function encrypt($text) 
{
    return trim(
        base64_encode(
            mcrypt_encrypt(
                MCRYPT_RIJNDAEL_256, // Non-standard block cipher; not AES
                $key,
                $text,
                MCRYPT_MODE_ECB, // ECB mode is insecure
                mcrypt_create_iv( // ECB mode doesn't use an IV anyway
                    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB),
                    MCRYPT_RAND // you want MCRYPT_DEV_URANDOM
                )
            )
        )
    ); 
}

对于非标准 Rijndael 变体,您正在使用 ECB 模式(无论如何都会丢弃 IV)生成 IV(不安全),并且您没有使用消息身份验证。没有消息认证的加密是一个致命的错误

Marc B,密钥长度为 34 个字符

如果您使用MCRYPT_RIJNDAEL_256的是 AES 或 AES(MCRYPT_RIJNDAEL_128顺便说一句;mcrypt 被认为是有害的),那么这些是唯一可接受的密钥大小:

  • 16 字节
  • 24 字节
  • 32 字节

您收到错误的原因是 34 是无效输入。这可能意味着您使用的是人类可读的密码而不是加密密钥。

TL;DR:不要推出自己的加密货币,而是使用经过充分研究的实现。defuse/php-encryptionZend\Crypt是你最好的选择。

于 2015-08-18T13:35:43.357 回答