#php #salt #crypt
#php #соль #крипта
Вопрос:
public function kryptonite($string){
$salt = "";
$salt_vars = array_merge(range("A","Z"),range("a","z"),range(0,9));
for($i=0;$i < 22;$i ){
$salt.= $salt_vars[array_rand($salt_vars)];
}
return crypt($string, '$6$'.$salt);
}
Это возвращается при обновлении:
$6$vnuqcEA70$CHWmPVsDVb.lVpq1PNsDn7.0fSmBX6FU2PlofK6dJOH7FQp6EdSsde3Aw6to8fY1L01/WOcWz8OIE0OxK1LTj.
$6$7lmp9sD4g$I0fAcDjno2Lf255gg6TxTLt9TRwR803ZXiU9BOWJXhWrGbJdPJ3LvAW9w2KbRZ/3EDSSbFrgF7rV7DdB0VliA0
Если вы внимательно посмотрите на первые несколько строк, она постоянно меняется. Я не думаю, что хеширование должно постоянно меняться! Так что технически я никогда не смогу протестировать это. Может кто-нибудь помочь мне с моей kryptonite
функцией crypt или объяснить мне, что на самом деле пошло не так.
Комментарии:
1. Почему бы вам просто не использовать
password_hash()
? Кроме того,$6$...
это недопустимая хэш-строка. Хэш-строка SHA512 имеет следующий формат$6$rounds=N$hashstringhere$
. Вы должны правильно прочитать документацию !2. 1. Не используйте
array_rand
в целях безопасности. 2. Используйте API для хеширования паролей.3. @SverriM. Олсен, я думал, что значение по умолчанию равно 5000 для раундов, поэтому вам не нужно объявлять его, если не изменять его. И я пока не могу использовать password_hash, моя версия PHP 5.2.* (000webhost) извините, что сказал. Я получаю немного денег на покупку хостинга у GoDaddy, поэтому я изменю функции для поддержки нового PHP
4. @EasyBB Затем используйте библиотеку совместимости .
5. Я прочитаю больше завтра, спасибо, Сверри.
Ответ №1:
На самом деле, хеширование должно изменяться случайным образом — это называется случайным солением. Ваша функция crypt создает случайную соль, которая подается в хешер SHA-512.
Вывод crypt()
включает в себя значение соли, которое затем будет использоваться при хешировании пароля для сравнения его с сохраненным хэшем.
public function kryptonite($string, $salt = null){
if ($salt === null) {
$salt = "";
$salt_vars = array_merge(range("A","Z"),range("a","z"),range(0,9));
for($i=0;$i < 22;$i ){
$salt.= $salt_vars[array_rand($salt_vars)];
}
$salt = '$6$' . $salt;
}
return crypt($string, $salt);
}
Чтобы использовать это, вам просто нужно сделать следующее:
$storedHash = '.....'; // fetched from database
$inputPassword = '.....'; // from the user
$salt = preg_match('/$[0-9]$(. )$/')[1]; // php 5.4
if (kryptonite($inputPassword, $salt) == $storedHash) {
//.... success
}
Обратите внимание, что реализация array_random для создания случайной соли не является криптографически безопасной — было бы лучше использовать openssl_random_pseudo_bytes()
or mt_rand()
или такой.
Комментарии:
1. У меня нет 5.4 : (Также я хотел бы отметить, что я учусь всему этому с помощью SO. Я собираюсь в колледж для этого, и я не начал этот курс. Я обычно забегаю вперед, поэтому мне не нужно слушать профессоров 🙂
2. Вам действительно нужно обновиться… но в любом случае, бит 5.4 — это просто возможность доступа к элементам массива непосредственно из результата вызова функции. В противном случае вам нужно сделать
$result = preg_match('...'); $salt = $result[1];
Ответ №2:
Вы не сможете получить тот же результат при использовании array_rand()
Я бы рекомендовал что-то вроде этого, если вы собираетесь использовать соли и нуждаетесь в двустороннем шифровании
function parse($action, $string) {
$output = false;
$encrypt_method = "AES-256-CBC";
// hash
$key = hash('sha256', "random encryption key that must stay the same");
// iv - encrypt method AES-256-CBC expects 16 bytes - else you will get a warning
$iv = substr(hash('sha256', "ARANDOMIV"), 0, 16);
if($action == 'encrypt') {
$output = openssl_encrypt($string, $encrypt_method, $key, 0, $iv);
$output = base64_encode($output);
} else if( $action == 'decrypt' ){
$output = openssl_decrypt(base64_decode($string), $encrypt_method, $key, 0, $iv);
}
return $output;
}
Комментарии:
1. Я не хочу шифровать или расшифровывать, поэтому я использовал crypt в качестве одностороннего алгоритма хеширования строк, хотя плюс 1 для openssl.
2. @EasyBB, хэш не может быть расшифрован.
3. Тогда почему вы классифицируете свои действия как шифрование и дешифрование
Ответ №3:
Вы не получите одинаковые хэши при использовании array_rand()
функции. Результат должен быть детерминированным.
Есть ли причина sha1()
, по которой этого недостаточно?
Комментарии:
1. Это именно то, что я подумал, я посмотрел видео об этом, чтобы помочь мне, и это то, что сказал парень. Есть какие-нибудь лучшие решения, сэр?
sha1()
доступна для грубой силы. md5 и sha1 даже указано, что они не используются в документах php2. @EasyBB Это было видео компетентного разработчика программного обеспечения или какого-то ребенка с YouTube?
3. Он казался компетентным, ХА-ХА, владеет или владел www.worldofwebcraft.com
4. Что вы хешируете? Если это для пароля, вы делаете это неправильно. Если вам нужно хеширование (например, для быстрого сравнения 2 файлов), используйте существующую функцию хеширования. Я не могу найти в документах, где PHP заявляет, что не использует sha1 для хеширования (за исключением паролей, как упоминалось выше).
5. @EasyBB В документах указано, что не следует использовать его в определенном контексте, не рекомендуя против него напрямую. В любом случае, если это для паролей, используйте bycrypt .