Шифрование с использованием crypt () - PullRequest
3 голосов
/ 19 ноября 2011

В настоящее время я работаю с очень безопасной системой входа в систему, но я новичок в функции crypt () и мне нужна небольшая помощь.

Я использовал crypt () для шифрования строки пароля во время регистрации и сохранил ее в базе данных.Тем не менее, как я смогу расшифровать ключ во время входа в систему?Или как мне поступить иначе?Или можно было бы поработать с предоставленной строкой пароля, чтобы сравнить ее с зашифрованным ключом в базе данных?

Ответы [ 5 ]

2 голосов
/ 19 ноября 2011

crypt() не шифрует пароли, он хеширует их.Принципиальное отличие состоит в том, что вы не можете вернуть хешированные пароли (вспомните о хэш-коричневых - если у вас есть хэш-коричневые, вы не можете вернуть картофель).

Таким образом, вы применяете ту же функцию для вводаи сравните его результат со значением, хранящимся в базе данных:

$stored_pw = get_hashed_password_from_db($_POST['username']);
crypt($_POST['password'], $stored_pw) == $stored_pw

Прочтите документацию на crypt(), чтобы понять «магию», стоящую за кодом, приведенным выше.

1 голос
/ 19 ноября 2011

Не шифруйте пароль.Вместо этого сохраните его с хешем.

Популярный поток SO: Как мне этически подходить к хранению пароля пользователя для последующего получения открытого текста?

1 голос
/ 19 ноября 2011

crypt() предоставленный пароль при входе.Сравните вывод с предыдущим выводом crypt().Если они совпадают, пароли совпадают.

Это базовая теория работы односторонней хеш-функции.

0 голосов
/ 18 апреля 2017

См.

http://php.net/manual/en/function.password-hash.php

и

http://php.net/manual/en/function.password-verify.php

Также никогда не используйте rand (), если вам нужны безопасные случайные значения.Это худший источник случайных значений в PHP.

В PHP 7 вместо этого следует использовать

http://php.net/manual/en/function.random-bytes.php

.Для более ранних версий см.

http://php.net/manual/en/function.openssl-random-pseudo-bytes.php

0 голосов
/ 09 июля 2012

Также это то, как вы должны это делать. Обратите внимание, что этот код - то, как я это сделаю, и вы можете изменить некоторые вещи. И вы должны определить свою собственную уникальную соль, будь то в файле конфигурации или в другом месте. Он должен либо: a) находиться в глобальной области, как я опубликовал, либо вы можете изменить его, чтобы он был определен в функции. Также вы не шифруете, вы фактически хешируете. Шифрование - это оба пути, хеширование - это шифрование одним способом. Это означает, что вы не можете расшифровать хэш. Вы можете только грубо угадать оригинальный текст.

/*
*   Copyright (c) 2012, Macarthur Inbody
*   The following code was posted on /8199146/shifrovanie-s-ispolzovaniem-crypt
*   The license is simply CC-by https://creativecommons.org/licenses/by/3.0/
*
*
*
*/


/*
 *
 * This is used to hash their password.
 *
 * @param   $password       string      the users supplied password
 * @param   $username       string      the users supplied username
 * @param   $rand_salt      int         the secondary salt -2^31-1 to 2^31-1 Must be defined previously.
 * @return  string the hashed password
 */
function hash_pass($username,$password,$rand_salt){

    global $unique_salt;
    $main_salt=base64_encode(hash('sha512',$username.$password.$config_salt);
    $main_salt=str_replace('+', '.', $salt);
    $main_salt=str_replace('=','/',$salt);
    $main_salt='$2$06'.$main_salt; //change this here to the cost factor that you want
    $hashed=crypt($unique_salt.$username.$password.$rand_salt,$main_salt);
    return $hashed;
}

function gen_rand_salt(){
    return rand();
}

function rand_str($length,$additional_entropy){
    $max_length=ceil($length/28);
    if(!is_defined($additional_entropy)){
        $additional_entropy='';
    }
    $str='';
    for($i=0;$i<=$max_length;++$i){
        $str.=base64_encode(sha1($i.''.microtime().$additional_entropy,true));
    }
    $str=substr($str,0,$length);
    return $str;
}

/*
*
* Generate A temp password/token
*
* This function generates a temporary password and also gives you
* the hashed password too. It is an array, arr[0]=password, arr[1]=
* hashed password. If it fails it'll return -1;
*
* @param    $username   the username
* @param    $rand_salt  the random salt value, must be given.
*
* @return   array       if it is successful array, if it fails it's a number of -1
*/ 
function generate_temp_password($username,$rand_salt){
    global $unique_salt;
    if(!is_defined($rand_salt)){
    return -1;
    }
    $pass_len=12; // change this to what you want for password recovery
    $pass_arr=Array();
    $password=rand_str($pass_len,$unique_salt.rand().$rand_salt);
    $password=substr(base64_encode(sha1($rand_str.$rand_salt,true)),0,$pass_len);
    $hashed_password=hash_pass($username,$password,$rand_salt);
    $pass_arr[0]=$password;
    $pass_arr[1]=$hashed_password;
    return $pass_arr;
}

Как указано в коде, лицензия CC-By, так как я считаю, что она достаточно хороша для большинства вещей. Также, пожалуйста, оставьте блок таким же, как и ссылку на эту страницу, поскольку это то, что я делаю со всем своим собственным исходным кодом. Также я понимаю, что «случайная» строка на самом деле не настолько случайна, но она достаточно случайна, чтобы вы могли ее использовать для той цели, которой она будет.

Редактировать 2: Также обязательно экранируйте имя пользователя пользователя. Я не экранирую пароль, поскольку хэширую его, поэтому экранировать его не нужно, поскольку он уже смягчен и будет просто тратить циклы. Но только , если вы делаете что-то подобное. Обязательно экранируйте имя пользователя с помощью mysql_real_escape_string . Если вы используете php5 +, вы должны заглянуть в mysqli (если вы используете mysql). Если вы используете другую систему, вам придется искать ее самостоятельно, так как я знаю только mysql. Я собираюсь уехать на пару дней, поэтому я очень надеюсь, что это сработает для вас. Я буду проверять это время от времени, но я могу забыть ... так что да. Надеюсь, это поможет вам, поскольку это безопасно, надежно и должно работать для вас.

Редактировать 3: изменена функция случайных строк, чтобы она стала немного сильнее , так как я забыл, что это будет использоваться для генерации временных паролей. Это должно сделать его достаточно случайным, чтобы его можно было использовать для этой цели, так как в противном случае сгенерированный пароль мог бы быть известен кому-то, знающему точное время (с текущим микротаймом), хотя крайне маловероятно, это все равно делает его немного сильнее и должно сделать его в безопасности от таких атак. Он не должен быть полностью готов к производству и должен быть безопасным для вашей системы. Обязательно установите переменную $ unique_salt somwhere в глобальной области видимости или устанавливайте ее каждый раз, когда она используется в каждой из этих функций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...