2013-03-04 3 views
51

Я использую код $enrypt=md5($pass) и вставляю $encrypt в базу данных. Я хочу узнать, как их расшифровать. Я попытался использовать дешифрующее программное обеспечение, но он говорит, что хэш должен быть ровно 16 байт. есть ли способ расшифровать его или сделать его 16-байтовым md5-хешем?encrypt and decrypt md5

Мой хэш выглядит следующим образом: c4ca4238a0b923820dcc

+11

Вы не расшифровывать MD5 ... – sachleen

+6

хэширования является односторонняя операция, то есть он не может быть расшифрован. Тем не менее, вы можете перетащить хэш, чтобы найти, какие данные для него работают. – Vulcan

+2

md5 - старый и легко разрушаемый механизм хэширования паролей, я предлагаю вам использовать последний алгоритм шифрования пароля. – KyelJmD

ответ

13

Там нет никакого способа для расшифровки MD5. Ну, есть, но нет разумный способ сделать это. В этом-то и дело.

Чтобы проверить, если кто-то вводит правильный пароль, вам необходимо указать MD5 независимо от введенного пользователем и посмотреть, совпадает ли он с тем, что у вас есть в базе данных.

+2

Нет, невозможно расшифровать MD5, потому что MD5 не является шифром. Но поскольку вы, вероятно, имели в виду его обратимость, вы можете только помнить пары ввода + вывода для последующего поиска или попытаться найти столкновений. Но вы не можете «расшифровать» его. – Gumbo

+0

@Gumbo: как работают дешифраторы MD5? Неважно, хранятся ли строки значений ключа, процесс предполагает, что MD5 не использует обычную соль, что означает, что она может быть отменена, если вы дойдете до ее ядра. – Fr0zenFyr

+9

Вот упрощённый способ: 5 + 5 - 10, но если у вас всего 10, вы не можете знать, что исходные номера были 5 и 5. Однако, если вы знаете алгоритм (возьмите два числа и добавьте их) , то вы можете отменить 10, чтобы получить 3 + 7, и это будет принято, потому что результат тот же. –

2

Хеши нельзя расшифровать check this out.

Если вы хотите шифровать-расшифровать, используйте двухстороннюю функцию шифрования вашей базы данных, например AES_ENCRYPT (в MySQL).

Но я предлагаю алгоритм CRYPT_BLOWFISH для хранения пароля. Читайте this- http://php.net/manual/en/function.crypt.php и http://us2.php.net/manual/en/function.password-hash.php

Для Blowfish по crypt() функции -

crypt('String', '$2a$07$twentytwocharactersalt$'); 

password_hash будет введена в PHP 5.5.

$options = [ 
    'cost' => 7, 
    'salt' => 'BCryptRequires22Chrcts', 
]; 
password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options); 

После сохранения пароля, вы можете проверить, если пользователь ввел правильный пароль, хеширования его снова и сравнивая его с сохраненным значением.

+3

Новая функция 'password_hash()' является хорошей рекомендацией, но она теряет часть своей выгоды, когда вы передаете свою соль. Просто позвольте функции генерировать соль, она делает это криптографически безопасным способом. – martinstoeckli

52

Как уже говорилось, вы не можете расшифровать MD5, не пытаясь взломать грубую силу, которая чрезвычайно ресурсоемкая, непрактичная и неэтичная.

Однако вы могли бы использовать что-то вроде этого для шифрования/дешифрования паролей/и т.д. безопасно:

$input = "SmackFactory"; 

$encrypted = encryptIt($input); 
$decrypted = decryptIt($encrypted); 

echo $encrypted . '<br />' . $decrypted; 

function encryptIt($q) { 
    $cryptKey = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qEncoded  = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($cryptKey), $q, MCRYPT_MODE_CBC, md5(md5($cryptKey)))); 
    return($qEncoded); 
} 

function decryptIt($q) { 
    $cryptKey = 'qJB0rGtIn5UB1xG03efyCp'; 
    $qDecoded  = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($cryptKey), base64_decode($q), MCRYPT_MODE_CBC, md5(md5($cryptKey))), "\0"); 
    return($qDecoded); 
} 

Использования Шифрованного метода с солью будет еще более безопасным, но это было бы хорошим следующим шаг мимо только с помощью хеш MD5.

+0

Для некоторых входов он не дешифрует правильно, пожалуйста, помогите –

+0

mcrypt_encrypt уже устарел в PHP 7.1.0. Полагаться на эту функцию крайне не рекомендуется. – girish

+0

@ girish есть ли у вас какие-либо предложения о том, как достичь аналогичного результата с php7? - Я собирался использовать его, и информация, которую я бы зашифровала, не важна вообще: я просто хочу сжать длинный $ input (это путь) и не хочу, чтобы пользователь читал этот путь, главным образом потому, что его длина. – Nihvel

5
/* you can match the exact string with table value*/ 

if(md5("string to match") == $res["hashstring"]) 
echo "login correct"; 
+0

, но эта строка не будет одинаковой для всех, я имею в виду, если есть 1000 пользователей, что строка пароля или строка идентификатора не будут одинаковыми, это будет новая строка для каждого пользователя. – Sharif

2

Этот вопрос помечен как PHP. Но многие люди сейчас используют Laravel. Это может помочь кому-то в будущем. Вот почему я отвечаю за Ларавеля. Легче шифровать и расшифровывать внутренние функции.

$string = 'c4ca4238a0b923820dcc'; 
$encrypted = \Illuminate\Support\Facades\Crypt::encrypt($string); 
$decrypted_string = \Illuminate\Support\Facades\Crypt::decrypt($encrypted); 

var_dump($string); 
var_dump($encrypted); 
var_dump($decrypted_string); 

Примечание: Убедитесь, что установить 16, 24 или 32 символов случайной строки в ключа выбору конфигурации/app.php файла. В противном случае зашифрованные значения не будут защищены.

Но вы не должны использовать шифрование и расшифровку для аутентификации. Скорее вы должны использовать хеш-марку и проверку.

Чтобы сохранить пароль в базе данных, введите хэш пароля и затем сохраните.

$password = Input::get('password_from_user'); 
$hashed = Hash::make($password); // save $hashed value 

Для проверки пароля, получить пароль, сохраненные счета из базы данных

// $user is database object 
// $inputs is Input from user 
if(\Illuminate\Support\Facades\Hash::check($inputs['password'], $user['password']) == false) { 
    // Password is not matching 
} else { 
    // Password is matching 
} 
+0

У вас есть ссылка на полную документацию для Crypt? Доступные режимы, дополнение, расширение ключа пароля, iv, формат вывода?Если нет, то нет способа взаимодействовать или считать, что шифрование является безопасным. [Encrypter] (https://laravel.com/api/5.2/Illuminate/Contracts/Encryption/Encrypter.html) недостаточно. – zaph

+0

чувак не работает, ваше шифрование - это что-то другое ... попытайтесь расшифровать это значение –

+0

и дешифрованное значение должно быть 123 –