В соответствии с комментарием, который я сделал по этому вопросу:
один важный момент был очень приукрашен почти всеми ... Моя первоначальная реакция была очень похожа на @Michael Brooks, пока я не понял, как и @stefanw, что проблема заключается в нарушении требований , но это то, что они есть.
Но потом мне пришло в голову, что это может быть даже не так! Недостающим моментом здесь является невысказанная стоимость активов приложения. Проще говоря, для низкозатратной системы полностью безопасный механизм аутентификации со всеми вовлеченными процессами был бы излишним, а неправильным выбором безопасности.
Очевидно, что для банка «лучшие практики» являются необходимостью, и нет способа этически нарушать CWE-257. Но легко представить себе системы с низкой стоимостью, где это просто не стоит (но простой пароль все еще необходим).
Важно помнить, что настоящий опыт в области безопасности заключается в поиске подходящих компромиссов, а НЕ в том, чтобы упрямо распространять «лучшие практики», которые каждый может прочитать в Интернете.
В качестве такового я предлагаю другое решение: в
зависимости от стоимости системы и ТОЛЬКО ЕСЛИ система имеет низкую стоимость без «дорогих» активов (включая саму идентификацию), И существуют действующие бизнес-требования, которые делают надлежащий процесс невозможно (или достаточно сложно / дорого), И клиент осведомлен обо всех предостережениях ...
Тогда может быть целесообразным просто разрешить обратимое шифрование, без каких-либо специальных перескоков.
Я не хочу сказать, что вообще не беспокоюсь о шифровании, потому что его очень просто / дешево реализовать (даже учитывая проходимость) управление ключами), и он обеспечивает некоторую защиту (больше, чем затраты на его реализацию). Кроме того, стоит посмотреть, как предоставить пользователю оригинальный пароль, будь то по электронной почте, на экране и т. Д.
Поскольку здесь предполагается, что значение украденного пароля (даже в совокупности) достаточно мало, любое из этих решений может быть действительным.
Поскольку идет оживленная дискуссия, на самом деле НЕСКОЛЬКО оживленных дискуссий, в разных постах и отдельных ветках комментариев, я добавлю некоторые пояснения и отвечу на некоторые очень хорошие моменты, которые были подняты в другом месте здесь.
Начнем с того, что всем здесь ясно, что получение исходного пароля пользователя является плохой практикой и, как правило, не очень хорошей идеей. Это вовсе не оспаривается ...
Далее, я подчеркну, что во многих, даже самых, ситуациях - это действительно неправильно, даже грязно, противно и некрасиво .
Однако суть вопроса заключается в принципе : существует ли ситуация, когда нет необходимости запрещать это, и если да, то как это сделать наиболее правильным образом, соответствующим ситуации .
Теперь, как упомянули @Thomas, @sfussenegger и несколько других, единственный правильный способ ответить на этот вопрос - провести тщательный анализ рисков любой конкретной (или гипотетической) ситуации, чтобы понять, что поставлено на карту, сколько стоит защитить и какие другие меры по смягчению находятся в игре, чтобы предоставить эту защиту.
Нет, это не модное слово, это один из основных и наиболее важных инструментов для профессионала в сфере безопасности. Лучшие практики хороши до определенного момента (как правило, как рекомендации для неопытных и хаков), после этого начинается тщательный анализ рисков.
Знаешь, это смешно - я всегда считал себя одним из фанатиков безопасности, и почему-то я нахожусь на противоположной стороне от так называемых "экспертов по безопасности" ... Ну, правда, потому что я фанатик, и реальный эксперт по безопасности в реальной жизни - я не верю в распространение догмы «передового опыта» (или CWE) БЕЗ такого важного анализа риска .
«Остерегайтесь фанатиков безопасности, которые быстро применяют все в своем поясе инструментов, не зная, что на самом деле они защищают. Больше безопасности не обязательно означает хорошую безопасность».
Анализ рисков и истинные фанатики безопасности будут указывать на более разумный компромисс между ценностью и риском, основанный на риске, потенциальных потерях, возможных угрозах, дополнительных мерах по снижению риска и т. Д. Любой «Эксперт по безопасности», который не может указать на обоснованный анализ риска как основа для их рекомендаций или поддержка логических компромиссов, но вместо этого они предпочли бы излагать догмы и CWE, даже не понимая, как выполнять анализ рисков, - ничто иное, как взломы безопасности, и их экспертиза не стоит той туалетной бумаги, на которой они напечатаны.
В самом деле, именно так мы получаем нелепость, связанную с охраной аэропорта.
Но прежде чем мы поговорим о подходящих компромиссах в ЭТОЙ СИТУАЦИИ, давайте рассмотрим очевидные риски (очевидные, поскольку у нас нет всей исходной информации об этой ситуации, мы все предполагаем - поскольку вопрос в том, что гипотетически ситуация может быть ...)
Давайте предположим, что система LOW-VALUE не настолько тривиальна, как публичный доступ - владелец системы хочет предотвратить случайную имитацию, но «высокая» безопасность не так важна, как простота использования. (Да, это законный компромисс с тем, чтобы принять риск того, что любой опытный сценарист может взломать сайт ... Подождите, разве сейчас APT не в моде ...?)
Например, скажем, я организую простой сайт для большой семейной встречи, позволяющий каждому провести мозговой штурм о том, куда мы хотим отправиться в поход в этом году. Меня меньше беспокоит какой-то анонимный хакер или даже кузен Фред, выдавливающий неоднократные предложения вернуться на озеро Вантанаманабикилики, так как я о том, что тетя Эрма не может войти в систему, когда ей это нужно. Теперь, тетя Эрма, будучи физиком-ядерщиком, не очень хорошо запоминает пароли или даже вообще не использует компьютеры ... Поэтому я хочу устранить все возможные трения для нее. Опять же, я НЕ беспокоюсь о взломах, я просто не хочу глупых ошибок неправильного входа в систему - я хочу знать, кто идет, и что они хотят.
Тем не мение.
Итак, каковы наши основные риски, если мы используем симметричное шифрование паролей вместо одностороннего хеширования?
- Выдавать себя за пользователей? Нет, я уже принял этот риск, не интересно.
- Злой администратор? Ну, может быть ... Но, опять же, мне все равно, сможет ли кто-то выдать себя за другого пользователя, ВНУТРЕННЕГО или нет ... и в любом случае злонамеренный администратор получит ваш пароль, независимо от того, что - если ваш администратор испортился, игра все равно закончится.
- Другая проблема, которая была поднята, заключается в том, что идентичность фактически разделяется между несколькими системами. Ах! Это очень интересный риск, который требует внимательного изучения.
Позвольте мне начать с утверждения, что это не фактическая идентичность , а доказательства или учетные данные аутентификации. Хорошо, так как общий пароль фактически позволит мне войти в другую систему (скажем, в мой банковский счет или в gmail), это фактически одна и та же личность, так что это всего лишь семантика ... За исключением того, что это не . Идентификационные данные управляются отдельно каждой системой, в этом сценарии (хотя могут существовать сторонние системы идентификаторов, такие как OAuth - тем не менее, они отделены от идентификационных данных в этой системе - подробнее об этом позже).
Таким образом, основная точка риска здесь заключается в том, что пользователь охотно вводит свой (один и тот же) пароль в несколько разных систем - и теперь я (администратор) или любой другой хакер моего сайта получу доступ к паролям тети Эрмы для место ядерной ракеты.
Хммм.
Вам здесь что-нибудь кажется?
Должно.
Начнем с того, что защита системы ядерных ракет не входит в мои обязанности , я просто строю прогулочный сайт семьи Фраккинов (для МОЕЙ семьи). Так чья это ответственность? Ммм ... Как насчет системы ядерных ракет? Duh.
Во-вторых, если бы я хотел украсть чей-то пароль (кто-то, кто, как известно, неоднократно использовал один и тот же пароль между безопасными сайтами и не очень безопасными), - зачем мне взламывать ваш сайт? Или боретесь с вашим симметричным шифрованием? Goshdarnitall, я могу просто создать свой собственный простой веб-сайт , чтобы пользователи подписывались, чтобы получать ОЧЕНЬ ВАЖНЫЕ НОВОСТИ обо всем, что они хотят ... Puffo Presto, я "украл" их пароли.
Да, обучение пользователей всегда возвращается, чтобы укусить нас в hienie, не так ли?
И с этим ничего не поделаешь ... Даже если вы БЫЛИ хешировать свои пароли на своем сайте и делаете все остальное, что может придумать АСП, вы добавили защиту к их паролю, а НЕ ОДНОМУ , если они собираются сохранить беспорядочно вставляя свои пароли в каждый сайт, на который они наталкиваются. Даже не пытайтесь.
Иными словами, вы не владеете их паролями , поэтому перестаньте пытаться вести себя, как вы.
Итак, мои дорогие эксперты по безопасности, как старуха спрашивала у Венди: «ГДЕ риск?»
Еще несколько моментов в ответ на некоторые вопросы, поднятые выше:
- CWE не является законом, нормативным актом или даже стандартом. Это набор общих слабостей , то есть обратная сторона «передового опыта».
- Проблема общей идентичности является актуальной проблемой, но неправильно понятой (или искаженной) скептиками здесь. Это проблема совместного использования идентификатора (!), А не взлома паролей в малоценных системах. Если вы разделяете пароль между системой с низкой и высокой стоимостью, проблема уже существует!
- Кстати, предыдущий пункт фактически указывал ПРОТИВ использования OAuth и тому подобного как для этих систем с низкой стоимостью, так и для систем с высокой стоимостью банковских операций.
- Я знаю, что это был только пример, но (к сожалению) системы ФБР на самом деле не самые безопасные. Не совсем как серверы блога вашей кошки, но при этом они не превосходят некоторые из более безопасных банков.
- Раздельное знание или двойное управление ключами шифрования не происходит только в армии, фактически PCI-DSS теперь требует этого практически от всех продавцов, так что это уже не так уж далеко (ЕСЛИ значение оправдывает это).
- Для всех тех, кто жалуется, что подобные вопросы делают профессию разработчика такой плохой: именно такие ответы делают профессию безопасности еще хуже. Опять-таки, требуется анализ рисков, ориентированный на бизнес, иначе вы становитесь бесполезными. Помимо того, что неправильно.
- Наверное, поэтому не стоит брать обычного разработчика и брать на себя больше обязанностей по обеспечению безопасности, не обучаясь думать по-другому и искать правильные компромиссы. Не обижайся на тех из вас, кто здесь, я за это - но нужно больше тренироваться.
Уф. Какой длинный пост ...
Но, чтобы ответить на ваш оригинальный вопрос, @Shane:
- Объясните клиенту, как правильно делать вещи.
- Если он все еще настаивает, объясните еще, настаивайте, спорьте. Выкинь истерику, если нужно.
- Объясните ему РИСК. Детали хорошие, цифры лучше, живое демо обычно лучше.
- ЕСЛИ ОН ВСЕ ЕЩЕ настаивает, И излагает веские деловые причины - пришло время сделать суждение: действительно
ли этот сайт не имеет никакой ценности? Это действительно правильный бизнес-кейс? Это достаточно хорошо для вас? Есть ли другие риски, которые вы можете рассмотреть, которые перевесили бы веские деловые причины? (И, конечно же, клиент НЕ является вредоносным сайтом, но это не так).
Если это так, просто идти вперед. Не стоит усилий, трений и потерянного использования (в этой гипотетической ситуации) для внедрения необходимого процесса. Любое другое решение (опять же, в этой ситуации) является плохим компромиссом.
Итак, суть и фактический ответ - зашифруйте его с помощью простого симметричного алгоритма, защитите ключ шифрования с помощью надежных ACL-списков и, предпочтительно, DPAPI и т. П., Документируйте его и попросите клиента (кого-то достаточно высокого, чтобы принять это решение) подписать. Это.