2015-08-03 9 views
0

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

function Encrypt($key, $payload) 
{ 
    $iv = mcrypt_create_iv(IV_SIZE, MCRYPT_DEV_URANDOM); 
    $crypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $payload, MCRYPT_MODE_CBC, $iv); 
    $combo = $iv . $crypt; 
    $garble = base64_encode($iv . $crypt); 
    return $garble; 
} 

Мой IV_SIZE заключается в следующем:

mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)) 

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

Это функция расшифровывать все еще довольно стандартны:

function Decrypt($key, $garble) 
{ 
    $combo = base64_decode($garble); 
    $iv = substr($combo, 0, IV_SIZE); 
    $crypt = substr($combo, IV_SIZE, strlen($combo)); 
    $payload = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $crypt, MCRYPT_MODE_CBC, $iv); 
    return $payload; 
} 

Говорит, что это 2 часа, что я пытаюсь выяснить, что это лучший подход к выдаче Войти сессию/куки. Я хочу использовать подход, основанный на токенах, как показано ниже.

Как только логин будет успешным, я хочу сохранить в cookie первую часть хэша. Весь хэш хранится в моей БД и уникален. Вторая часть будет чем-то вроде соли + sha/md5/base64 (...) идентификатора пользователя, электронной почты, метки времени и т. Д. Это хороший подход?

+0

Это действительно зависит от требований вашего проекта. Если вы не планируете получать много трафика или иметь много ресурсов сервера, я предлагаю использовать БД в качестве способа хранения сеансов и т. Д. Причин как то более надежный, чем другие. Все, что вам нужно сделать, это сохранить временную метку. В большинстве случаев это настойчиво. Пользователи могут закрыть браузер, перезагрузить свой компьютер и вернуться и все еще иметь активный сеанс и т. Д. Однако этот подход будет использовать больше ресурсов сервера, чем другие обычные методы, поскольку он должен запрашивать БД каждый раз, когда перезагружается страница. – khuderm

+0

Вам просто нужно взвесить, какая опция лучше подходит вам, а не выбрать тот, который говорит человек, лучший – khuderm

ответ

0

No.

Если вам не нужно иметь доступ к обычному тексту паролю (например, если это пароль для настроенного сервера SMTP, который вы используете), вы не должны шифровать пароли, но хэша их.
И используйте password_hash() (bcrypt) для их использования; он специально разработан для этой цели.

Кроме того, не ясно в вашем вопросе, что эти хэш для, но это звучит как некорректный выбор в лучшем случае - MD5 и SHA1 не должен использоваться для любого вида механизмов безопасности сегодня и если вы хотите проверить подлинность чего-то, вы должны использовать хеш-функцию с ключом, например hash_hmac().

Используйте общий сеанс PHP для поддержки состояния входа в систему.

Мне кажется, что вы слишком задумываетесь над проблемой и, в свою очередь, переоцениваете решение. Будь проще.

+0

Мне не нужны пароли с открытым текстом. В моей базе данных я сохраняю результат функции Encrypt() с кодировкой base_64. Затем я обнаруживаю, что в базе данных есть совпадение, передающее пароль, введенный пользователем с помощью функции Decrypt(). Разве это не хорошо? Когда есть совпадение (верно пароль), я выдаю токен, действительный для X дней.Я генерирую токен с bin2hex (openssl_random_pseudo_bytes (20)); и я использую его для идентификации зарегистрированного пользователя в моей системе. В основном я использую этот токен как эквивалент идентификатора пользователя, и я сохраняю его в файле cookie. – user1274113

+0

Затем ** хэш ** пароли, не шифруйте их. Шифрование является двусторонним, что означает, что у вас есть доступ к простым текстам, и если у вас есть это, потенциальный злоумышленник может также иметь его. Что касается токенов ... это основной механизм, который использует обычный сеанс PHP. В обоих случаях вы перерабатываете решение и, скорее всего, не видите важных деталей процесса. – Narf

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

  • Нет связанных вопросов^_^