Комментарии 97
Нельзя сделать vkontakte, facebook да и любую соц сеть на заказ.
можно, но получатся одноглазнеги
Я немного в начале карьеры так поработал, да я сделал впечатляющие проекты и мой уровень тогда вырос многократно, но я увидел как это заказывается, как потом эксплуатируется, как работает обратная связь.
а я, прежде чем зарегистрировать ООО, устраивался в две местные студии погромистом. В обеих принесли задания с oDesk, плохо переведённые чьей-то родственницей
Одностороннее шифрование и хэширование это разные вещи.
Хэширование выдает на выходе хэш, размер которого всегда фиксирован независимо от размера исходных данных. При хэшировании могут быть коллизии — для двух разных паролей на входе будет получен одинаковый хэш на выходе (и соль здесь не поможет). Это очень здорово когда ваш рандомный 22-символьный пароль от банк-клиента имеет тот же хэш, что и пароль 123.
Одностороннее шифрование это просто симметричное шифрование в котором в качестве ключа используется в том или ином виде сам исходный текст (пароль). Размер шифротекста при этом будет пропорционален размеру исходного текста. Никаких коллизий нет.
Под словами «могут быть» стоит упомянуть, что для современных алгоритмов хеширования (к примеру, SHA-256) такие коллизии никогда найдены небыли. Математически, вероятность коллизии настолько мала, что ей можно пренебречь.
как раз математически вероятность ОЧЕНЬ велика. Если входные данные для SHA-256 составят 257 бит — даже при идеально-сферическом хеше будет гарантированная коллизия.
А теперь посчитаем в байтах. 256 бит это 64 байта. Если добавить всего 1 байт — то на сообщениях получим 256 коллизий. Добавив 8 байт получим 18 446 744 073 709 551 616 коллизий. От буфера в 72 байта, да.
Число коллизий для килобайта или сотни килобайт — можете попробовать посчитать самостоятельно.
Это Generalized birthday probled. Чтобы получить вероятность ~40% коллизии требуется сгенерировать 2^128 хэшей. И это будет коллизия между двумя случайными хэшами. Чтобы найти коллизию с заданным хэшем вам потребуется перебрать еще больше хэшей, что делает перебор практически невозможным.
Ну вообще, Base64 сложно назвать шифрованием как таковым. А вот MD5, если солить пароли (со случайной солью), в принципе вполне подойдет.
Base64 сложно назвать шифрованием как таковымПочему сложно? Base64 — алгоритм шифрования, который не использует ключ для шифрования и дешифрования информации. Основными преимуществами алгоритма являются скорость, компактность и универсальность :)
Ну пляшущие человечки тоже когда то считались надёжным шифрованием. Кстати является ли сжатие данных шифрованием с вашей точки зрения?
Я подумал, что цитата, смайлик и описанные мною «преимущества», должны намекать, что я явно не считаю Base64 алгоритмом шифрования. Но оказалось, что в конце недели люди воспринимают вещи «слишком буквально».
Нет, «пляшущие человечки», как и Base64 никогда не являлись шифрованием.С каких пор наступило это «никогда» для «пляшущих человечков»? (Они ещё были в какой-то мере применением стеганографии.)
Например, шифрование обязательно требует ключ и обеспечивает целостность данных,Ключ у «человечков» есть (это «таблица соответствия» букв и рисунков), а требование целостности откуда взялось? Тогда и «Шифр Цезаря» уже не шифр?
(В русской википедии ссылаются на книгу «Э. Мэйволд. Безопасность сетей.», где это может (?) иметь какой-то смысл. А в английской от шифрования этого не требуют:
Encryption, by itself, can protect the confidentiality of messages, but other techniques are still needed to protect the integrity and authenticity of a message)
С каких пор наступило это «никогда» для «пляшущих человечков»?Base64, как и «пляшущие человечки» это алгоритмы кодирования/подмены символов.
Ключ у «человечков» есть (это «таблица соответствия» букв и рисунков)Это не ключ, а алфавит. У Base64 тоже есть свой алфавит.
а требование целостности откуда взялось?Вы правы, я ляпнул необдуманное. Благодарю за поправку!
они могут не являться надежным шифрованием, но в остальном это неважно
XOR - это тоже вполне себе шифрование
Равно как и причислять SHA-256 к небезопасным методам хранения паролей. По словарю их, конечно, подобрать проще чем bcrypt, но на практике соленый SHA-256 вполне хорошо работает.
Мой пароль "cheburek s katyshkami". И не случайное число и запоминается. Найдёте по словарю с мутацией на GTX1080TI?
– Как вы думаете, Учитель, пароль "史達林格勒戰役" стойкий?
– Нет, – ответил мастер Инь, – это словарный пароль.
– Но такого слова нет в словарях…
– «Словарный» означает, что это сочетание символов есть в wordlists, то есть «словарях» для перебора, которые подключаются к программам криптоанализа. Эти словари составляются из всех сочетаний символов, которые когда-либо встречались в Сети.
– А пароль «Pft,bcm» подойдёт?
– Вряд ли. Он тоже словарный.
– Но как же? Это же…
– Введи это сочетание в Гугле – и сам увидишь.
Сисадмин защёлкал клавишами.
– О, да. Вы правы, Учитель.
Через некоторое время Сисадмин воскликнул:
– Учитель, я подобрал хороший пароль, которого не может быть в словарях.
Инь Фу Во кивнул.
– Я ввёл его в Гугле, – продолжал Сисадмин, – и убедился, что в Сети такого сочетания нет.
– Теперь есть.
А если серьезно, то этот пароль относительно легко подобрать, если использовать сочетание перебора по словарю, вариативность и склеивание раных вариантов.
Почитайте про «brain wallet» биткойн кошельки, как у людей уводили кошельки, к которым использовались пароли посложнее вашего.
разработчики-фрилансеры по умолчанию придерживаются исключительно небезопасных практик
Не очень понятно, при чем здесь фрилансеры? А разработчики, сидящие в офисе, от таких ошибок застрахованы по умолчанию?
Ну а вообще да, любая работа должна контролироваться (=code review), выполняться в разумные сроки, и достойно оплачиваться. С последним пунктом в исследовании явно была проблема.
А что вы удивляетесь, на каком сайте ни регаешься, везде: ваш пароль не может привышать 20 символов. Тут либо блочные шифры, либо пишут как есть. Кстати, base64 вполне себе подходит кодировать непечатные символы после шифровки.
Старый советский анекдот.
— Что должен делать молодой специалист за зарплату в 80 рублей?
— Ничего, и даже немножечко вредить
Летела ракета, упала в болото. Какая зарплата — такая работа!
Вообще, я бы сказал, что не только у фрилансеров проблема с криптографией. По моему опыту большая часть разработчиков не особо разбирается в криптографии. И не потомучто они плохие специалисты, а просто потомучто они никогда не сталкивались с ней и скорее всего никогда не столкнутся. А даже те кто знают что-то, то знают «по-верхам». Банально могут знать, что надо хранить не пароль, а его хеш. Но очень мало знают, например, по каким критериям SHA-1 считается небезопасным, PBKDF2 уже считается более-менее приемлемым, а bcrypt/scrypt — хорошим. Я уж вообще молчу про понимание того для чего действительно нужна соль. Так что заявление, что вот именно фрилансеры и именно веб-разработчики такие плохие и ничего не понимают в криптографии звучит как минимум странно. Я уж вообще молчу, что (судя по ставке) выборка там была далеко не из топовых разработчиков.
Плюс случайная ошибка в запросе (забудем по userId отфильтровать например) может привести к фулскану таблички с перевычислением хеша для каждой строчки, что на сколь-нибудь приличной базе пользователей отправит сервер в закат на несколько часов.
Ну и сама эта функция не особа осмысленна из-за нагрузки на сервер бд. Вычисления хешей паролей при более-менее нормальном потоке пользователей просто положат вам сервер.
Ну а то что вычисление хешей есть в бд, так хеши не только для паролей используются, и в других задачах к функциям хеширования могут применяться диаметрально противоположные требования. Плюс возможно сделать запрос «ручками».
Ну и строго говоря, что считать за «вообще ничего», а что за «в общих чертах» — это вопрос терминологии. Реальность в том, что большая часть знакомых мне разработчиков сходу не увидят проблем в вышеописанном способе хеширования паролей, а как уж это назвать — дело десятое.
А зачем это вообще делать вручную? Есть же специальные библиотеки для этого.
Кроме того кругом читаю, мол "не пытайтесь самостоятельно реализовывать криптографию, и даже вместе собирать готовые части то же не пытайтесь".
import org.springframework.security.crypto.bcrypt.BCrypt;
....
final String hash = BCrypt.hashpw(password, BCrypt.gensalt(10));
...
final boolean isCorrect = BCrypt.checkpw(password, hash);
Я это все к чему — использование криптобиблиотек — это хорошо и правильно, но это не отменяет того, что неплохо бы понимать что именно этот код делает и как это соотносится с тем, что требуется сделать (разумеется не нужно знать реализацию самого шифрования, но вот контракты знать стоит). А то ведь можно использовать стойкий алгоритм, но использовать его с такими параметры, что окажется не сильно безопаснее SHA-1.
Я это все к чему — использование криптобиблиотек — это хорошо и правильно, но это не отменяет того, что неплохо бы понимать что именно этот код делает и как это соотносится с тем, что требуется сделать
Вот с этим полностью согласен. Хотя, замечу, дефолтные параметры в том же PHP вполне пригодны для обычных сайтов и приложений. Если же у приложения какие-то специфические требования к хэшированию паролей — то разработчик обязан их учесть.
шифрование — это очень такое широкое и растяжимое понятие, для кого-то и запись символов в обратном порядке — тоже шифрование; надо внятно и точно объяснять, чего надо и хочется, а не пытаться найти дурака, который гривенник разменяет по рублю;
«сделайте хорошо» — это не тз, это либо свойская частная просьба, либо откровенная подйопка;
Так там же "разработать систему регистрации для… социальной сети".
— Хранить как CHAR, а не как INT.
— Передать методом POST, а не GET.
— Хешировать, а не шифровать.
Скорее всего ещё придётся указать, что если пользователь будет ввести неверный пароль, то не нужно его авторизовать. И конечно, что необходимо обезопасить приложение от SQL-инъекций и CSRF-атак.
ЗЫ: Что-то мне подсказывает, что те, кто отказался от выполнения работы, как раз и были нормальными специалистами, с которыми не захотели обсуждать требования и повышенное вознаграждение, а говно на скорую руку они сделать не пожелали.
Например, заменить
base64_encode()
на password_hash()
ничего не стоит (наоборот, даже сократит время разработки). И поверьте, стоимость работы никак не влияет на профессионализм разработчика. Если человек говорит, что «очень сложно расшифровать Base64», можете заплатить ему хоть миллион, от этого он не перестанет «шифровать пароли с помощью Base64» или хранить их как обычный текст. Достаточно взглянуть на крупные корпорации, которые забывают, как правильно хранить пароли и сразу становиться ясно, что проблема скорее всего не в деньгах.Чем менее професионален исполнитель, тем более подробное ТЗ ему нужно, чтобы выдавать приличный результат.
Поэтому, Вы должны задаваться следующим вопросом: почему большинство фрилансеров за те же условия (деньги и ТЗ) использовали правильные алгоритмы, а некоторые нет.
есть опытные программисты с большим опытом фриланса. за такие деньги вряд ли откликнувшиеся.
есть опытные программисты, но как фрилансеры только начинают. вполне могут откликнуться и сделать либо хорошо либо "срого по ТЗ"
а есть начинающие программисты и "люди с улицы" ;) с ними либо никак либо с подсказки кто-то из них сможет что-то сделать
Дело в том, что опытному программисту не нужны несколько дней, чтобы имплементировать процесс регистрации в готовом проекте. Например, первый фрилансер сдал работу через 21 часов, но он хранил пароли как обычный текст. Когда его попросили защитить пароли, ему потребовалось 38 часов, чтобы сделать это (для сравнения, один из фрилансеров перешёл на BCrypt всего за 4 минуты). Разве это не говорит о том, что задача была довольно проста для опытного разработчика?
Если человек никогда не сталкивался с хранением паролей, то примерно рабочая неделя и уходит на вникание в тему. Можно, конечно, и просто скопировать код из первой попавшейся ссылки на stack overflow, но тогда и результат может получиться соответствующий.
Второй случай, про 4 минуты, как раз подтверждает тезис «строго по ТЗ» :)
Ну и 38 часов тоже не особо показатель :) может, 37 с половиной часов он занимался другим проектом (за 2000 евро), а эту задачку оставил напоследок…
а вообще: «правильное ТЗ — половина дела»
Насчёт ТЗ, я уже сказал своё мнение — профессионал должен сделать всё правильно, даже если заказчик ничего в этом не понимает или указал в ТЗ «ЧТО» делать, но не указал «КАК» это делать. Например, если у Вас есть заказ на вёрстку сайта, Вы ведь не будете использовать иконки в формате BMP по 99МБ каждая, даже если заказчик ничего не указал об этом в ТЗ. Также, я уверен, что Вы не будете тестировать результат только в одном браузере.
При необходимости профессионал должен описывать несколько сценариев и позволить заказчику выбрать то, что ему подходит. Более того, если заказчик указал в ТЗ, что необходимо применить плохое решение, профессионал должен донести это до заказчика.
И это касается не только программистов, но и всех специалистов, включая механиков, врачей, сантехников, строителей и других.
Ленивый поиск уязвимостей в системах, которые показались относительно интересными за последние пару месяцев, дал пугающие результаты:
А) Люди массово считают четырехзначный СМС-код надежным способом авторизации.
Б) Чуть меньшее количество людей просто не проверяет число попыток. 10000 попыток ввода четырехзначного кода — пожалуйста. Хотя одна компания выставила ограничение в 500 попыток, которое потом убрала.
Это встречается как у тех сервисов, где вообще не ожидаешь безопасной разработки хоть какого-то уровня (кодер что-то выдал, это не падает с ошибками — премию ему), так и у довольно серьезных организаций: начиная от различных элитных и не очень доставок еды, чатиков, систем управления службами такси, заканчивая сервисами телемедицины, банками, авиакомпаниями и мобильными операторами.
Пугает то, что в такой ситуации никто из псевдо-инженеров: кодеры, тимлиды, тестировщики, безопасники (да, у некоторых из этих компаний есть безопасники), не задавался вопросом, зачем вообще они делают авторизацию. Немного боюсь того, что они выдадут в следующий раз.
* Перед новой попыткой ввода (хотя обычно перед набором попыток, от 3 до 75 (!)) отправляется новое СМС, правда можно спокойно запрашивать по 200 СМС в минуту.
* Обратный отсчёт есть, но он только на фронтенде. Перехватил трафик — радуешься жизни.
* Продвинутый баг: новое СМС не отправляется из-за ограничения на число СМС в минуту, но счётчик проверок обнуляется: слепой брутфорс, плюс он менее заметный для жертвы.
главное не испортить всё передачей и хранением пароля в текстовом виде :)
В последнее время кажется, что довольно много проектов реализуются людьми, которые вообще не понимают, что и зачем они делают.
«Из-за конфиденциальности моей работы я понятия не имею, что делаю» ©
Есть инструкция, пошаговый аглоритм для вредрения шифрования?
Программисты, которые зашифровали пароли, использовали небезопасные методы: 31 программист использовал для шифрования такие методы, как Base64, MD5, SHA-1 и т. д.
Вообще-то MD-5, SHA-1, как и SHA-256 и другие и иже с ними российские stribog-и это хэш функции и ничего зашифровать они не могут. Можно конечно говорить, что из пароля получим хэш и именно он будет паролем. Но это… Вопрос-то остается открытым как зашифровать? А дальше, зашифруем на каком-то ключе. А как ключ спрятать? Опять шифровать будем. Авторизоваться, на мой взгляд, оптимально на сертификата, хранимом на токене PKCS#11. Да и просто пароль можно хранить на флэшке, хранимой в кармане.
Да, и Base64 тоже ничего не шифрует, просто переводит в текстовый вид. Примените обратную операцию и получите исходный пароль.
Наличие соли хеша существенно усложняет брутфорс? С чего вдруг? Подбор по словарю — усложняет, да
Плюс соль делает невозможным массовый брутфорс (когда мы имеем 100500 хэшей, перебираем пароли и смотрим с каким из имеющихся хэшей он совпал)
Что-то непонятно, а что хотели от разработчиков с прайсом 100-200$ за 1-8 дней?
Веб-разработчики пишут небезопасный код по умолчанию