Каков формат строки солярия пароля для хэша MD5? - PullRequest
0 голосов
/ 16 февраля 2019

Я создаю простое приложение для доступа к БД, используя C ++, и я добавил таблицу пользователей, содержащую: ID , USER , ПАРОЛЬ и СОЛЬ, и я использую Crypto ++ в качестве крипто-бэкэнда.Поэтому я создал эту функцию:

#include "crypto.h"

#define CRYPTOPP_ENABLE_NAMESPACE_WEAK 1
#include <md5.h>
#include <hex.h>
#include <osrng.h>

using namespace std;
using namespace CryptoPP;

string MyCrypto::MD5(const string strMessage)
{
    byte arrbyDigest[Weak::MD5::DIGESTSIZE];
    Weak::MD5 hash;
    hash.CalculateDigest(arrbyDigest, /*(const byte*)*/strMessage.c_str(), strMessage.length());

    HexEncoder encoder;
    string strOutput;

    encoder.Attach(new StringSink(strOutput));
    encoder.Put(arrbyDigest, sizeof(arrbyDigest));
    encoder.MessageEnd();

    return strOutput;
}

string MyCrypto::GenerateSalt(const size_t length /*= 16*/)
{
    SecByteBlock arrbySalt(length);
    AutoSeededRandomPool asrp;
    asrp.GenerateBlock(arrbySalt, length);

    string strSalt(arrbySalt);
    strSalt.ToAscii();

    return strSalt;
}

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

Итак, мои вопросы:

Правильно ли я делаю это?

Длина соли 16 , как ясделал практический путь?

Должен ли я зашифровать солт-строку в Base 64 , HEX или оставить ее как обычный текст при объединении собычная строка пароля перед хешем MD5?

Должен ли я зашифровать солт-строку в Base 64 , HEX или оставить ее как обычный текст при сохранении в базу данных?

Какие у вас предложения?

1 Ответ

0 голосов
/ 20 февраля 2019

Нет, вы делаете это неправильно.MD5 - или, точнее, был - криптографически безопасный хеш.Это не относится напрямую к хеш-паролям.Чтобы хэшировать пароли, вам нужен хеш пароля, который содержит случайную соль и коэффициент работы (стоимость или количество итераций, в зависимости от используемого хэша пароля).Примерами этого являются bcrypt, PBKDF2 и более новый Argon2. Здесь - это случайная статья, в которой обсуждается использование хэшей паролей.

Что касается кодировки, я бы всегда старался придерживаться существующих стандартов там, где они существуют.Для хеширования паролей применимым стандартом является Modular Crypt Format .Если вы разрабатываете новую схему без строгих требований к взаимодействию, вы также можете использовать Формат хеширования пароля .

Оба используют тип кодировки base 64 в качестве выходного формата.для соли и пароля.Примером является вывод bcrypt $2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy, где 2a указывает bcrypt и формат, 10 - это стоимость (коэффициент работы), а N9qo8uLOickgx2ZMRZoMye - кодирование соли 64;остальное - хеш пароля.Обратите внимание, что между солью и паролем нет знака доллара.

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

Почти забыл, да, 16 случайных байтов / 128 битов соли - это множество ;никто бы не моргнул, если бы вы использовали 8 байт, более 32 байт переусердствовали.

...