Лучший способ использовать PHP, чтобы зашифровать и дешифровать пароли? [дубликат]

Для текста JSON:

application/json

тип среды MIME для текста JSON application/json . Кодировка по умолчанию является UTF-8. (Источник: RFC 4627 ).

Для JSONP (выполнимый JavaScript) с обратным вызовом:

application/javascript

Вот некоторые сообщения в блоге, которые были упомянуты в комментариях, которые релевантны.

216
задан Community 23 May 2017 в 01:33
поделиться

4 ответа

Вы не должны шифровать пароли, вместо этого вы должны хешировать их, используя такой алгоритм, как bcrypt. В этом ответе объясняется, как правильно реализовать хеширование паролей в PHP . Тем не менее, вот как вы могли бы зашифровать / расшифровать:

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

Чтобы зашифровать:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

Расшифровать:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

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

См. Также:

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


Демонстрация на 3v4l.org :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "
300
ответ дан 23 November 2019 в 04:18
поделиться

Одна вещь, о которой следует помнить при работе с шифрованием:

Попытки быть умными и изобретать что-то свое обычно оставляют вас с чем-то небезопасным.

Вам, вероятно, лучше всего будет использовать одно из расширений шифрования , которые поставляются с PHP.

12
ответ дан 23 November 2019 в 04:18
поделиться

Это даст вам лишь минимальную защиту. Если злоумышленник может запустить произвольный код в вашем приложении, он сможет получить пароли точно так же, как ваше приложение. Вы все еще можете получить некоторую защиту от некоторых атак SQL-инъекций и неуместных резервных копий БД, если вы храните секретный ключ в файле и используете его для шифрования на пути к БД и дешифрования на выходе. Но вы должны использовать bindparams, чтобы полностью избежать проблемы внедрения SQL.

Если вы решите зашифровать, вы должны использовать для этого какую-нибудь криптографическую библиотеку высокого уровня, или вы ошибетесь. Вам нужно будет получить ключ-настройку, заполнение сообщения и проверки целостности правильные, или все ваши усилия по шифрованию бесполезны. GPGME - хороший пример. Mcrypt слишком низкий уровень, и вы, вероятно, ошибетесь.

2
ответ дан 23 November 2019 в 04:18
поделиться

Проверьте mycrypt (): http: // us. php.net/manual/en/book.mcrypt.php

И если вы используете postgres, есть pgcrypto для шифрования на уровне базы данных. (упрощает поиск и сортировку)

1
ответ дан 23 November 2019 в 04:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: