php sha256 безопасен сегодня (май 2019)? - PullRequest
0 голосов
/ 14 мая 2019

Безопасно ли использовать sha256 на странице входа в мой сайт, а затем зашифровать его с помощью base64_encode? Мне нужны ваши рекомендации. Спасибо от всего.

    $username = $_POST['username'];
    $password=  $_POST['password'];
    $sPassword= hash('sha256',$password);
    $ePassword= base64_encode($sPassword);

    $insertSQLQuery = $conn->query("INSERT INTO tbl_users (username,password) 
VALUES ('$username ','$ePassword')");

Ответы [ 4 ]

3 голосов
/ 14 мая 2019

Нет необходимости использовать метод hash() и крайне бессмысленно создавать собственные методы хеширования, когда в PHP есть собственные встроенные функции для достижения этой цели.

password_hash() и password_verify.

Ссылаясь на ответ @ Дэвида. Вы также должны создать соль: это уникальное «дополнение», которое вы вводите в пароль перед хэшированием, чтобы обеспечить дальнейшие измерения безопасности и целостность данных. К счастью для нас, встроенная в PHP функция password_hash() делает это, когда вы предоставляете ей предопределенный алгоритм PASSWORD_BCRYPT.

К вашему сведению: @treyBake ссылается на то, что ваш запрос открыт для SQL-инъекций. Используйте подготовленные заявления и проверяйте работоспособность!

if(
   isset(($username = $_POST['username'])) &&
   isset(($password = $_POST['password']))
) {
    ($con->prepare('INSERT INTO tbl_users (username, password) VALUES (? ,?)'))
         ->execute(array(
             $username,
             password_hash(base64_encode($password), PASSWORD_BCRYPT)
         ));
}
0 голосов
/ 16 мая 2019

Я использую эти методы. Кроме того, вы можете изменить значение ключа $ для вашего любимого значения. как я. Для предотвращения инъекций используйте PDO
https://phpdelusions.net/pdo

function HeratHostEn( $q ) {
    $key = "NazirAhmadHeratHost";
    $cryptKey  = 'qJB0rGtIn5UB1xG03efyCp'.$key;
    $qEncoded  = base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, md5($cryptKey), $q, MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ) );
    return( $qEncoded );
}

function HeratHostDe( $q ) {
    $key = "NazirAhmadHeratHost";
    $cryptKey  = 'qJB0rGtIn5UB1xG03efyCp'.$key;
    $qDecoded      = rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, md5( $cryptKey ), base64_decode( $q ), MCRYPT_MODE_CBC, md5( md5( $cryptKey ) ) ), "\0");
    return( $qDecoded );
}
0 голосов
/ 14 мая 2019

Для большого комментария! О:

$sPassword= hash('sha256',$password);
$ePassword= base64_encode($sPassword);

Эта конструкция не имеет смысла. hash('sha256',$password) возвращает строку из 64 шестнадцатеричных цифр. base64_encode() взорвать его до 88 символов. Оба читаются человеком и поэтому бесполезны.

Моя рекомендация: либо вы используете $sPassword (и пропустите второй шаг), либо измените свой код на:

$sPassword= hash('sha256',$password,true);
//                                 ^^^^^
$ePassword= base64_encode($sPassword);

В этом случае hash() возвращает строку с 32 двоичными символами, а base64_encode() увеличивает ее до 44 символов. И это меньше 64 шестнадцатеричных цифр.

В любом случае: удалите возможную инъекцию SQL для $username.

0 голосов
/ 14 мая 2019

Это если вы используете salt. sha256 использует алгоритм, который заключается только в одном: вы можете зашифровать строку, но не можете отменить операцию. Проблема состоит в том, что существуют базы данных с тоннами данных каждой возможной строки длиной до 12 символов, зашифрованных в различных системах шифрования, и вы можете получить исходную строку, выполнив запрос к базе данных в считанные секунды. Вот почему вы должны использовать соль.

Соль - это предопределенная длинная строка, используемая в качестве ключа, присоединенного к вашему паролю перед шифрованием. Поскольку @Jaquarh комментирует, вы должны создавать и хранить разные соли для каждого пользователя. Например, вы можете сгенерировать случайную строку. Также вы должны использовать привязку данных к вашему запросу, чтобы предотвратить инъекции SQL.

В вашем коде вы можете сделать его намного более защищенным следующим образом:

$salt = substr(md5(rand()), 0, 20) //this will generate a 20 characters random string
$username = $_POST['username'];
$password=  $_POST['password'].$salt;
$sPassword= hash('sha256',$password);
$ePassword= base64_encode($sPassword);

$insertSQLQuery = $conn->prepare("INSERT INTO tbl_users (username,password) 
VALUES ('?','?')");
//You may want to validate your $username and $ePassword here
$insertSQLQuery->execute(array($username, $ePassword));

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

...