Разумно ли шифровать данные с помощью SHA256, используя режим счетчика?

Мне нужно зашифровать пароли пользователей vpn для проекта. Они хранятся только на локальном компьютере, но я хочу избежать паролей в виде простого текста на жестком диске. Я повторно солю и хеширую мастер-пароль пользователя для шифрования vpn-паролей с помощью XTEA в режиме счетчика... Потом я подумал, что также возможно зашифровать vpn-пароли с помощью sha256 в своего рода режиме счетчика.

псевдо-код C:

    string masterpasswd, txtdata;
    uint32_t data[] = unicode(txtdata);
    uint32_t key[8] = sha256(masterpasswd+salt);
    for(int i=0;i<data_size;i++) {
      encrypted[i] = data[i] ^ key[i];
      key=sha256(key+i);
    }

Я не хочу использовать openssl, потому что я ленив;) Это разумное решение?


person Brolf    schedule 25.02.2014    source источник
comment
Ленивые люди обычно хорошие программисты. Удачи! ;)   -  person Ean V    schedule 25.02.2014
comment
SHA — это алгоритм хеширования, а не метод шифрования.   -  person Captain Obvlious    schedule 25.02.2014
comment
@Captain Obvlious: я знаю, но я хочу превратить его в метод шифрования. Я спросил, потому что не уверен в безопасности этого кода.   -  person Brolf    schedule 25.02.2014
comment
Вы не можете этого сделать. Если вам нужно шифрование, используйте шифрование. Если вам нужен хэш, используйте хэш.   -  person Captain Obvlious    schedule 25.02.2014
comment
Профессионально выполненное шифрование производственного уровня время от времени имеет проблемы (есть причина, по которой версии OpenSSL доходят до 1.0.0l и 1.0.1f). Самодельное шифрование повсеместно, неизменно фундаментально нарушено. Это намного сложнее, чем вы думаете. Дьявол кроется в деталях. Эти детали разоряют банк.   -  person Kuba hasn't forgotten Monica    schedule 25.02.2014


Ответы (2)


Нет - что произойдет, если ваши данные больше, чем ваш ключ, для пользователей, чей пароль «правильный штапель лошадиной батареи»?

Либо

  • ваш код ломается, потому что он пытается найти 9-й байт 8-байтового ключа

or

  • ваша фактическая реализация (а не ваш псевдокод) заканчивается тем, что снова возвращается к байту 0 ключа, то есть к режиму ECB, который вы никогда не должны использовать (см. Adobe), поскольку тогда "passwordpassword" привести к одному и тому же зашифрованному выводу дважды, что является огромным намеком.

А если серьезно, не делайте этого. Вы должны использовать PBKDF2 (для OpenSSL это PKCS5_PBKDF2_HMAC() с EVP_sha512() в качестве хеш-функции — вам понадобятся evp.h и sha.h) для получения ключа шифрования требуемого размера из вашего мастер-пароля и соли, и затем используйте, скажем, OpenSSL, чтобы фактически выполнить шифрование, используя что-то другое, кроме режима ecb.

person Anti-weakpasswords    schedule 25.02.2014
comment
Вы на миссии, и я одобряю вашу миссию. Это хорошая миссия, и что касается миссий, то они бесконечны. Удачи :) - person Kuba hasn't forgotten Monica; 25.02.2014

Вы можете быть еще более ленивым и использовать существующий класс для Qt Simple Crypt :)

person ariwez    schedule 25.02.2014
comment
Использование самодельного шифрования — всегда плохая идея. Поскольку связывание Qt с openssl тривиально, даже если вам нужен статически связанный исполняемый файл Windows, я действительно не вижу причин для самодельных решений. В принципе, если это для шифрования, а не для популярной библиотеки, на которую смотрели люди, которые знают, что они делают, безопаснее предположить, что она сломана. - person Kuba hasn't forgotten Monica; 25.02.2014
comment
@KubaOber, если вы читали статью: Сильная криптография, очевидно, лучшее решение [...] это может быть излишним в данной ситуации. - person ariwez; 25.02.2014