Лучший способ использовать PHP для шифрования и расшифровки паролей? [дубликат]
Возможные Дубликаты:
PHP 2-way encryption: мне нужно хранить пароли, которые могут быть получены
Я планирую хранить иностранных учетной информации для моих пользователей на моем сайте, он же рапидшарой логин и пароли и т. д... Я хочу сохранить информацию в безопасности, но я знаю, что если я хэширую их информацию, я не могу получить ее для последующего использования.
Base64 расшифровывается, поэтому нет смысла использовать это просто.
Моя идея такова чтобы скремблировать пользователя и пройти до и после того, как он получит base64ed таким образом, даже после его расшифровки, вы получите какой-то забавный текст, если попытаетесь расшифровать. Есть ли функция php, которая принимает значения, которые сделают уникальный скремблирование строки и де-скремблировать его позже, когда значение повторно вводится?
какие предложения?
8 ответов:
вы не должны шифровать пароли, вместо этого вы должны хэшировать их с помощью алгоритма, как bcrypt. этот ответ объясняет, как правильно реализовать хэширование паролей в PHP. тем не менее, вот как вы бы шифровать/расшифровывать:
$key = 'password to (en/de)crypt'; $string = ' string to be encrypted '; // note the spacesШифровать:
$iv = mcrypt_create_iv( mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC), MCRYPT_DEV_URANDOM ); $encrypted = base64_encode( $iv . mcrypt_encrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $key, true), $string, MCRYPT_MODE_CBC, $iv ) );Расшифровать:
$data = base64_decode($encrypted); $iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)); $decrypted = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_128, hash('sha256', $key, true), substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)), MCRYPT_MODE_CBC, $iv ), "" );
предупреждение: приведенный выше пример шифрует информацию, но она не аутентифицируется зашифрованный текст для предотвращения подделки. вы должны не полагайтесь на несанкционированное шифрование для обеспечения безопасности, тем более что предоставленный код уязвим к атакам oracle padding.
посмотреть также:
- https://stackoverflow.com/a/30189841/2224584
- https://stackoverflow.com/a/30166085/2224584
- https://stackoverflow.com/a/30159120/2224584
кроме того, не просто использовать "пароль" для получения ключа шифрования. ключи шифрования-это случайные строки.
echo 'Encrypted:' . "\n"; var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688=" echo "\n"; echo 'Decrypted:' . "\n"; var_dump($decrypted); // " string to be encrypted "
Предупреждение: этот класс не является безопасной. Он использует Rijndael256-ЕЦБ, что не является семантически безопасным. Просто потому, что "это работает" не означает "это безопасно". Кроме того, он лишает хвостовые пространства впоследствии из-за не использования надлежащего заполнения.
нашел этот класс недавно, он работает как сон!
class Encryption { var $skey = "yourSecretKey"; // you can change it public function safe_b64encode($string) { $data = base64_encode($string); $data = str_replace(array('+','/','='),array('-','_',''),$data); return $data; } public function safe_b64decode($string) { $data = str_replace(array('-','_'),array('+','/'),$string); $mod4 = strlen($data) % 4; if ($mod4) { $data .= substr('====', $mod4); } return base64_decode($data); } public function encode($value){ if(!$value){return false;} $text = $value; $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->skey, $text, MCRYPT_MODE_ECB, $iv); return trim($this->safe_b64encode($crypttext)); } public function decode($value){ if(!$value){return false;} $crypttext = $this->safe_b64decode($value); $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); $decrypttext = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->skey, $crypttext, MCRYPT_MODE_ECB, $iv); return trim($decrypttext); } }и назвать его:
$str = "My secret String"; $converter = new Encryption; $encoded = $converter->encode($str ); $decoded = $converter->decode($encoded); echo "$encoded<p>$decoded";
предупреждение: этот код не является безопасным.
пример
define('SALT', 'whateveryouwant'); function encrypt($text) { return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, SALT, $text, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); } function decrypt($text) { return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); } $encryptedmessage = encrypt("your message"); echo decrypt($encryptedmessage);
одна вещь, которую вы должны быть очень осведомлены при работе с шифрованием:
пытаясь быть умным и изобретать свою собственную вещь, как правило, оставит вас с чем-то небезопасным.
вам, вероятно, лучше всего использовать один из криптография расширения которые поставляются с PHP.
Securiy Предупреждение: этот код неуверенность. В дополнение к тому, что он уязвим для атак выбранного шифрованного текста, его зависимость от
unserialize()делает его уязвимым для инъекции объекта PHP.для обработки строки / массива я использую эти две функции:
function encryptStringArray ($stringArray, $key = "Your secret salt thingie") { $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,'); return $s; } function decryptStringArray ($stringArray, $key = "Your secret salt thingie") { $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "")); return $s; }Это гибкий, как в вы можете хранить / отправлять через URL строку или массив, потому что строка/массив сериализуется перед шифрованием.
Это даст вам только предельную защиту. Если злоумышленник может запустить произвольный код в вашем приложении, они могут получить пароли точно так же, как и ваше приложение. Вы все еще можете получить некоторую защиту от некоторых атак SQL-инъекций и неуместных резервных копий БД, если вы храните секретный ключ в файле и используете его для шифрования на пути к БД и расшифровки на выходе. Но вы должны использовать bindparams, чтобы полностью избежать проблемы SQL-инъекции.
Если решите для шифрования вы должны использовать некоторую криптографическую библиотеку высокого уровня для этого, или вы будет сделать это неправильно. Вам нужно будет правильно настроить ключ, заполнить сообщение и проверить целостность, или все ваши усилия по шифрованию мало полезны. GPGME хороший выбор для одного примера. Mcrypt-это слишком низкий уровень, и вы, вероятно, ошибетесь.
Проверьте mycrypt ():http://us.php.net/manual/en/book.mcrypt.php
и если вы используете postgres есть pgcrypto для шифрования уровня базы данных. (облегчает поиск и сортировку)
лучшая идея для шифрования / расшифровки данных в базе данных, даже если у вас есть доступ к коду, чтобы использовать 2 разных проходит личный пароль (
user-pass) для каждого пользователя и личный код для всех пользователей (system-pass).сценарий
user-passхранится в MD5 в базе данных и используется для проверки каждого пользователя для входа в систему. Этот пропуск пользователя разные для каждого пользователя.- каждая запись пользователя в базе данных есть в md5 a
system-passдля шифрования / расшифровки данных. Эта система-pass является то же самое для каждого пользователя.- каждый раз, когда пользователь удаляется из системы, все данные, зашифрованные в старой системе, должны быть зашифрованы снова в новой системе, чтобы избежать проблем с безопасностью.
Comments