2012-04-04 3 views
0

Мой сайт построен в Wordpress, и мы собираем личную информацию, которую мне нужно будет поместить в мою базу данных. Вот мой php до сих пор для ввода:PHP-шифрование с wordpress

//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.

Теперь я пытаюсь реализовать декодирование на бэкэнде админ-области, чтобы я мог искать по домену и подтягивать учетные данные. Это мой код:

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-расшифровывать]: Размер ключа слишком велик для этого алгоритма в/NAS/шр/WWW/постановка/thewpvalet/WP-содержание/плагины/user-info/index.php в строке 43

Любая идея, что я могу делать неправильно здесь?

+0

как долго $ key/KEY_ENCRYPT? –

+4

Христос, вы действительно не должны использовать WordPress, чтобы принимать данные кредитной карты. Вы даже заглянули в чрезвычайно тяжелую задачу, которая соответствует требованиям PCI? Для этого используйте службу, например Stripe. – ceejayoz

+1

ceejayoz, извините, но если вы собираетесь сделать комментарий, пожалуйста, оставайтесь с вопросом. Я использую stripe и используя класс Stripe.js для отправки токенов для информации CC. Теперь это относится к учетным данным и серверам Wordpress, которые мне нужны для миграции. Если у вас нет чего-то приятного или полезного, чтобы сказать, не делая предположения, пожалуйста, не комментируйте. – Enrico

ответ

2

Любая идея, что я могу делать неправильно здесь?

Да, вы ошибаетесь, это rolling your own cryptography. Давайте добавим некоторые пробелы и посмотреть на вашу функцию в деталях:

/** 
* 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 
       ) 
      ) 
     ) 
    ); 
} 

Вы генерирующий капельницу (небезопасным) с режимом ЕЦБ (который отбрасывает IV в любом случае), для нестандартного варианта Rijndael, и вы повторное использование аутентификации сообщения. Encryption without message authentication is a fatal mistake.

Marc B, ключ 34 символов

Если вы используете MCRYPT_RIJNDAEL_256 или AES (который исключительно MCRYPT_RIJNDAEL_128 кстати; mcrypt is considered harmful), они являются единственно приемлемыми ключевыми размерами:

  • 16 байт
  • 24 байт
  • 32 байта

Причина, по которой вы получаете ошибку, состоит в том, что 34 является недопустимым вводом. Вероятно, это означает, что вместо ключа шифрования вы используете пароль для чтения человеком.

TL; DR: Не свертывайте свой собственный криптографический код, используйте вместо этого хорошо изученную реализацию. defuse/php-encryption и Zend\Crypt - ваш лучший выбор.