2013-09-30 3 views
0

Я пытаюсь написать веб-приложение, которое позволяет зарегистрированным пользователям хранить пароли для разных приложений в MySQL db. Но чтобы администраторы MySQL не могли читать эти пароли непосредственно из db, я бы хотел, чтобы эти пароли были нечитабельны, прежде чем отправлять их в db. Затем, когда пользователь хочет посмотреть сохраненные пароли, веб-приложение расшифровывает сохраненные пароли и отображает их на экране.хранить/читать пароли в/из базы данных

Я пытаюсь разработать метод шифрования этих паролей для хранения в db и затем расшифровать их при чтении из db.

Так, например: - Пользователь хочет сохранить новый пароль: Abc123! - Затем веб-приложение преобразует данный пароль в «gibberish»: 234fohj234] j8924] (или что-то подобное) и сохраняет его в db. - Когда пользователь открывает веб-приложение для просмотра своих сохраненных паролей, он видит правильный пароль: Abc123! - Но когда администратор MySQL использует такую ​​программу, как PHPMyAdmin для просмотра/ведения базы данных, он будет видеть только пароль «gibberish», а не настоящий.

Предлагает ли PHP (или MySQL) встроенную функцию для чего-то подобного? Или у кого-нибудь есть советы по созданию функции для этого?

+2

Это называется шифрованием, и хорошо документировано в [PHP документах] (http://www.php.net/manual/en/intro.mcrypt.php) –

+0

http://perishablepress.com/ encoding-decoding-php/goog статья о кодировании и декодировании – Rab

+1

@Rab - не совсем ссылка, которую я бы рекомендовал, поскольку единственное упомянутое шифрование - rot13 –

ответ

0

PHP предлагает библиотеку MCrypt использовать двухстороннее шифрование. Самая большая проблема заключается в том, где хранить ключ, но это еще один вопрос. Лучшая защита, которую вы можете дать, - это когда вы вообще не храните ключ (используемый для шифрования) и позволяете пользователю вводить ключ каждый раз, когда он использует вашу службу. Недостатком является то, что функция забытого пароля недоступна таким образом.

Будьте осторожны, чтобы не использовать режим ECB для шифрования, тот же пароль всегда будет приводить к тому же самому cyphertext, вместо этого использует другой режим со случайным IV-вектором. Поскольку в руководстве PHP есть примеры, в которых используется режим ECB, я добавил небольшой пример, который использует вектор IV и сохраняет его в результате.

/** 
* Encrypts data with the TWOFISH algorithm. The IV vector will be 
* included in the resulting binary string. 
* @param string $data Data to encrypt. Trailing \0 characters will get lost. 
* @param string $key This key will be used to encrypt the data. The key 
* will be hashed to a binary representation before it is used. 
* @return string Returns the encrypted data in form of a binary string. 
*/ 
function encryptTwofish($data, $key) 
{ 
    if (!defined('MCRYPT_DEV_URANDOM')) throw new Exception('The MCRYPT_DEV_URANDOM source is required (PHP 5.3).'); 
    if (!defined('MCRYPT_TWOFISH')) throw new Exception('The MCRYPT_TWOFISH algorithm is required (PHP 5.3).'); 

    // The cbc mode is preferable over the ecb mode 
    $td = mcrypt_module_open(MCRYPT_TWOFISH, '', MCRYPT_MODE_CBC, ''); 

    // Twofish accepts a key of 32 bytes. Because usually longer strings 
    // with only readable characters are passed, we build a binary string. 
    $binaryKey = hash('sha256', $key, true); 

    // Create initialization vector of 16 bytes 
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM); 

    mcrypt_generic_init($td, $binaryKey, $iv); 
    $encryptedData = mcrypt_generic($td, $data); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    // Combine iv and encrypted text 
    return $iv . $encryptedData; 
} 

/** 
* Decrypts data, formerly encrypted with @see encryptTwofish. 
* @param string $encryptedData Binary string with encrypted data. 
* @param string $key This key will be used to decrypt the data. 
* @return string Returns the original decrypted data. 
*/ 
function decryptTwofish($encryptedData, $key) 
{ 
    if (!defined('MCRYPT_TWOFISH')) throw new Exception('The MCRYPT_TWOFISH algorithm is required (PHP 5.3).'); 

    $td = mcrypt_module_open(MCRYPT_TWOFISH, '', MCRYPT_MODE_CBC, ''); 

    // Extract initialization vector from encrypted data 
    $ivSize = mcrypt_enc_get_iv_size($td); 
    $iv = substr($encryptedData, 0, $ivSize); 
    $encryptedData = substr($encryptedData, $ivSize); 

    $binaryKey = hash('sha256', $key, true); 

    mcrypt_generic_init($td, $binaryKey, $iv); 
    $decryptedData = mdecrypt_generic($td, $encryptedData); 
    mcrypt_generic_deinit($td); 
    mcrypt_module_close($td); 

    // Original data was padded with 0-characters to block-size 
    return rtrim($decryptedData, "\0"); 
} 
+0

Спасибо martinstoeckli, я посмотрю на предлагаемое решение. – Denniz

Смежные вопросы