Written on 08 Октября 2013 .

Три подхода к хранению паролей объяснены с примерами.

Введение

Ныне почти каждому веб-сайту надо хранить список пользователей и паролей. Многим многопользовательским приложениям требуется метод аутентификации пользователей, и пароли кажутся нормальными.

Не обязательно надо предоставлять собственное решение аутентификации по логину и паролю. Альтернативы включают в себя использование Active Directory (в домене Microsoft), Паспорт Microsoft, LDAP (упрощённый протокол доступа к каталогу) для не Microsoft сред и каркас членства, имеющийся в.NET 2.0. Все 4 альтернативы имеют свое место, но если вы хотите понять логику в основе хранения паролей и понять, как правильно реализовать схему управления паролями, то эта статья для вас.

Выполняется: либо пароль пользователя, либо база данных паролей пользователей в целом. Описание: злоумышленник пытается получить пароль пользователя, сопоставляя его дайджест с набором «наиболее возможных» паролей, обычно генерируемых из списка слов в словаре. Эта атака использует сильную слабость в современных приложениях, важно, чтобы в качестве пароля было задано слово словаря.

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

Данная статья основана на построении веб-приложения - к построению многопользовательских приложений применяютеся несколько другие правила. В распределенных многопользовательских приложениях процесс подтверждение подлинности следует несколько отличающимся правилам.


Простейший подход – просто хранить

Простейший подход к управлению логинами и паролями – хранить все в виде простого текста (без шифрования и перестановки элементов) в файле или базе данных. Результат был бы таким:

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

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

Идентификатор пользователя

Логин

Пароль

101

Bob

Snake

102

David

Rainbow6

103

George

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

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

DarkTower

104

Eve

Snake

Плюсы хранения паролей в незашифрованном виде

1. Подтверждение подлинности (проверка, что пара логина и пароля совпадает с парой в таблице) очень простое – сравниваются строки!
2. Забытые пароли можно восстановить – пароль легкодоступен, если указан логин.

Мобильный телефон как ошибка может выявить закрытый ключ. «Простой мобильный телефон рядом с компьютером можно использовать для проведения таких атак», - пишут исследователи. Анализ звука может проводиться с расстояния с помощью помещенных ошибок. Требуется только звуковой сигнал. Ученые-компьютерщики также показали, что направленный микроскоп и измерительная станция на расстоянии четыре метра подходят для записи шума компьютера с достаточным качеством. Атака также была успешной с несколькими различными компьютерными моделями.

Безопасность в Интернете Вот как выглядит безопасный пароль

Кроме того, электрическое напряжение, под которым стоит ноутбук, подходит для использования, предупреждают исследователи. Их можно использовать аналогично, чтобы восстановить ключ за куском. Небезопасные пароли взломаются в кратчайшие сроки. Таким образом, основные правила для безопасного пароля: используйте не менее двенадцати символов, прописных и строчных букв, цифр и специальных символов.

  • Суперкомпьютер может тестировать более двух миллиардов паролей в секунду.
  • Меркшатце помогает избежать характера.
Большинство учетных записей пользователей в Интернете защищены одним.

Минусы хранения паролей в незашифрованном виде

1. Во-первых, любой с доступом к файлу (или могущий производить выборку из таблицы) получает немедленный доступ ко всем паролям! Работник с законным доступом к файлу может распечатать файл или отправить информацию по электронной почте, и – вуаля! – все пароли скомпрометированы.

Всего несколько минут, чтобы получить действительно безопасный пароль. Насколько опасен слабый пароль, можно рассчитать. Большинство хаков выполняются так называемыми атаками грубой силы, на немецком языке «с грубым насилием». Для этой цели соответствующие программы вычисляют все комбинации букв, чисел и символов. Чем короче и проще пароль, тем быстрее он будет взломан. Профессор Клаудиа Экерт, руководитель Института прикладной и интегрированной безопасности Фраунгофера, подтверждает: «Самые быстрые суперкомпьютеры теперь могут тестировать более двух миллиардов ключей в секунду».

Но SQL 2005 поддерживает шифрование – его недостаточно? Нет, шифрования SQL недостаточно. Встроенное шифрование защищает только информацию на диске. Если пользователю разрешено обращаться к данным (выполнять SELECT), SQL автоматически расшифрует информацию. Если веб-приложению разрешено обращаться к данным (как иначе сравнить логин и пароль?), то хакер, взламывающий приложение, может обратиться к данным, получив тот же доступ, что и веб-приложение.

Шифрование паролей в unix с помощью des

Чтобы рассчитать безопасность пароля, требуется два шага. Сначала вы должны узнать, сколько комбинаций существует для пароля. Для этого есть формула: комбинация = длина символьного пространства с большой длиной пароля. Размер пространства символов - это максимальное количество возможных символов, т.е. около 26 букв в верхнем регистре или десять цифр.

На втором этапе количество комбинаций делится на два миллиарда. Это дает вам время в секундах, что суперкомпьютеру понадобится долго, чтобы взломать его. Это звучит сложнее, чем есть. Поскольку есть десять цифр, а пароль имеет шесть цифр, количество комбинаций - десять высоких шесть = один миллион. Разделенный на два миллиарда результатов: этот пароль будет разбит на долю секунды.

2. Вторая проблема заключается в том, что во время обмена аутентификационной информацией пароль видим в сети. Если везде не используется защищенная связь, пароль будет виден при прохождении по сети. Например, даже если веб-приложение использует SSL (уровень защищённых сокетов) для отправки пароля, пароль по-прежнему виден, когда сервер веб-приложения выбирает информацию из удаленной базы данных. Результаты запроса передаются по сети незашифрованными.

Хранение длины пароля – почему и как

Популярный «пароль» состоит из восьми букв, из которых немецкий алфавит имеет 26. Для проверки всех комбинаций суперкомпьютеру потребуется не более 104 секунд, то есть менее двух минут. Поскольку «пароль» в течение многих лет, однако, занимает первое место среди наиболее распространенных паролей, смарт-хакер, вероятно, попытается это сделать первым.

X11, SVGA и экранная безопасность

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

Допустимо ли хранить пароли в незашифрованном виде?

Если хранилище данных зашифровано (например, используется SQL Server 2005),
и внутренняя сеть связи сильно защищена (используется только IP-SEC или туннель VPN (виртуальная частная сеть) для связи между серверами),
и используется только защищенная связь между клиентом приложения и сервером приложения,
и вы уверены, что все работники с доступом к базе данных вообще не совершают ошибок (таких как печать парольной информации или сохранение в файл),
и вы уверены, что никто другой не имеет физического доступа к любому из используемых серверов.

Хранение хешированных паролей – необратимое решение

Существует несколько приложений, которые могут хранить зашифрованные документы. Открытие документов возможно только при указании необходимого пароля. Пароль для открытия документа должен быть передан получателю через защищенный канал. Затем вы можете установить пароль для открытия файла. Кроме того, вы можете установить второй пароль для редактирования документа.

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

  • Объемы зашифрованных томов не могут быть удалены без инициализации.
  • Сохраните свой пароль или ключ шифрования.
Установите флажок «Шифровать объем диска» на шаге 5 быстрой настройки.

Тогда да, хранить пароли в незашифрованном виде нормально.

Шифрование паролей – чуть безопасней

Лучший подход к хранению паролей (и единственная обоснованная альтернатива, если пользователям надо иметь возможность восстанавливать пароли) – шифрование паролей перед их сохранением.

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

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

Создайте новый том с зашифрованным диском с новыми жесткими дисками




Только администратор может ввести пароль шифрования, чтобы разблокировать том. . Выберите тип тома, а затем выберите диски, которые вы хотите создать в качестве тома.


Выберите «Настройки защиты моментальных снимков», если тип тома находится между многократным громкостью и множественным тонким томом.

Шифрование паролей – обратимая операция. Тайна используется для искажения пароля, и та же самая тайна может быть использована для восстановления оригинального пароля. Когда пользователь задает пароль, сохраненный пароль расшифровывается с помощью тайны, и пароли сравниваются. Альтернативный подход – зашифровать предоставленный пароль с помощью тайны и сравнить две искаженные версии – совпадение показывает, что предоставлен правильный пароль.

Убедитесь, что этот том диска зашифрован




Проверьте «Шифрование», выполните настройки и нажмите «Далее».


Вся информация о выбранных дисках будет удалена.


Вы можете увидеть значок блокировки в столбце «Состояние» для томов с зашифрованными дисками. Если диск не зашифрован, вы не увидите этот значок.

Поведение зашифрованного тома после перезапуска системы

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

Если пользователю надо восстановить пароль, сохраненный пароль расшифровывается и доставляется пользователю (обычно по электронной почте).

Идентификатор пользователя

Логин

Пароль

101

Управление ключами шифрования




Если вы включите опцию «Сохранить ключ шифрования», вы только отредактируете фальсификацию данных, если жесткие диски были украдены. Выберите том диска и нажмите «Управление».


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

Допустимо ли хранить пароли в незашифрованном виде?




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








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

Bob

k468dD8F

102

David

56lkV#p6

103

George

8Fk4lVQ0

104

Eve

k468dD8F

Плюсы шифрования с помощью тайны

1. Забытый или утерянный пароль можно восстановить.
2. Только одну тайну (алгоритм или ключ) надо хранить безопасно.
3. Для многопользовательских распределенных приложений при использовании шифрования надо передавать незашифрованный пароль (для проверки) или надо передавать тайну для выполнения аутентификации в клиенте.

Минусы шифрования паролей

1. Если тайна скомпрометирована, все пароли скомпрометированы. Если у кого-то есть доступ к тайне и к хранилищу паролей, все пароли могут быть расшифрованы!
2. Только доступа к хранилищу паролей достаточно, чтобы предоставить информацию о паролях, так как все пароли шифруются с помощью одинакового алгоритма. Если два пользователя имеют одинаковый зашифрованный пароль, они также должны иметь одинаковый пароль. Хитрые хакеры с доступом к хранилищу паролей могут создать пользователей с известными паролями и проверить на наличие других пользователей с таким же паролем. Такой тип атаки является разновидностью атаки с известным открытым текстом. Такие атаки можно остановить с помощью соли (смотри ниже).
3. При использовании блочного шифра длина пароля должна храниться в составе зашифрованного пароля. Надо хранить длину, потому что блочные шифры всегда дают блок зашифрованного текста фиксированного размера. Если длина пароля не зашифрована (например, если хранится как столбец в таблице), информация очень полезна для взломщиков паролей. Знание точной длины пароля сильно упрощает угадывание пароля.

Если восстановление утерянного пароля обязательно, то да – это единственное приемлемое решение. Несколько рекомендаций:

Храните тайну в защищенном месте. Жесткое задание тайны в коде приложения – плохое решение. Хранение тайны в файле (даже в файле web.config) – ужасная идея. Если надо использовать тайну, храните ее в базе данных (ограничение доступа путем требования аутентифицированного подключения) или в ключе реестра с ограниченным доступом.
Используйте надежный алгоритм шифрования (примеры ниже), не создавайте свой собственный и не используйте тривиальный алгоритм шифрования. Если вы не знаете, что именно делаете, ваш собственный алгоритм может быть очень легко взломать.
Выходные данные шифрования двоичные и должны быть закодированы, если хранятся как текст. Если хранение двоичных данных приемлемо, кодирование не требуется, но если зашифрованные пароли должны храниться как текст, обдумайте использование RADIX64 для преобразования двоичных данных в текст. RADIX64 использует символ для каждых 6 битов, увеличивая выходные данные на 33%.

Хранение хешированных паролей – необратимое решение

Криптографическая хеш-функция является необратимой функцией. Хеш-функция принимает входные данные любой длины и генерирует уникальные выходные данные постоянной длины. Например, если пароль (любой длины) хешируется криптографической хеш-функцией MD5, результатом будет 128 битное число, однозначно соответствующее паролю. Криптографические хеши работают не только на паролях – если криптографический хеш двух файлов идентичен, то два файла идентичны.

В последние годы в связи с ростом вычислительных мощностей некоторые криптографические хеш-функции больше не рекомендуется использовать (MD4, MD5, SHA1). Однако их допустимо применять для хеширования паролей. Или же измените код так, чтобы он использовал SHA2.

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

Прелесть необратимой функции заключается в том, что невозможно вычислить пароль на основе хеша. Хешированные пароли неустойчивы к атаке перебором – при наличии словаря и хеша пароля хакер может вычислить хеши всех слов в словаре, сравнить слова с хешем пароля и узнать пароль. Надежные пароли (содержащие буквы, цифры и специальные символы) помогают защититься от атак перебором.

Плюсы хранения хешированных паролей

1. Оригинальный незашифрованный пароль вообще не хранится. Даже если хранилище пароля скомпрометировано, только хеши становятся общедоступными.
2. Длина пароля не хранится и не поддается оценке, что сильно затрудняет взлом пароля.
3. Не нужна тайна, так как никакая тайна не используется для хеширования пароля.
4. Для многопользовательских распределенных приложений хеш пароля может использоваться для аутентификации. При использовании шифрования приходится передавать незашифрованный пароль (для проверки) или приходится передавать тайну для выполнения аутентификации в клиенте.

Минусы хранения хешированных паролей

1. Утерянные пароли нельзя восстановить (кроме как использовать методы перебора). Новый пароль приходится создавать и передавать пользователю.
2. Как и для зашифрованных паролей, если не используется соль (смотри ниже), пользователи с одинаковым паролем будут иметь одинаковый хеш пароля.

Приемлемо ли такое решение хранения паролей?

Используйте надежную криптографическую хеш-функцию. MD5 и SHA1 не рекомендуются. SHA2 – текущий фаворит. Если нужно использовать MD5 или SHA1, используйте более стойкий алгоритм соления.
Используйте соль (смотри ниже), чтобы не дать двум пользователям с одинаковым паролем иметь одинаковый зашифрованный пароль.
Выходные данные хеширования двоичные и должны быть закодированы, если хранятся как текст. Если хранение двоичных данных приемлемо, кодирование не требуется, но если хешированные пароли должны храниться как текст, обдумайте использование RADIX64 для преобразования двоичных данных в текст. RADIX64 использует символ для каждых 6 битов, увеличивая выходные данные на 33%.

Хранение длины пароля – почему и как

Почему надо хранить длину пароля?

Длина пароля нужна только при шифровке и расшифровке пароля с помощью блочного шифра. Многие блочные шифры имеют размер блока 64 бит – размер зашифрованных данных кратен 8 байтам. Шифрование 12 байтового пароля даст на выходе 16 байт. При расшифровке 16 байт результатом будет 16 байтовая строка с мусором в последних 4 байтах. Если хранится длина пароля, лишнее дополнение можно убрать при расшифровке пароля. Без его удаления любые примитивные попытки сравнить строки провалятся – 12 символьный пароль не совпадает с 16 символьным расшифрованным паролем. Попытка сравнить зашифрованные пароли для проверки на совпадение может провалиться, потому что лишние 4 байта дополнения могут отличаться от шифрования к шифрованию.

Хеширование не требует длины пароля – хеширование 12 символьного пароля с помощью SHA2 всегда дает на выходе 320 битов, и хеширование того же самого пароля всегда дает на выходе те же самые 320 битов.

При использовании алгоритма шифрования, такого как ROT13 (что не рекомендуется), длина зашифрованного пароля совпадает с длиной оригинального пароля. Любой с доступом к хранилищу паролей тогда может получить длину пароля. Если вы решите использовать алгоритм шифрования или поточный шифр (в отличие от блочного шифра), обязательно дополняйте выходные данные, чтобы скрыть длину пароля.

Как можно хранить длину пароля?

Одно решение – хранить длину пароля в виде столбца в таблице. Недостаток этого подхода состоит в том, что если хакер получит доступ к данным, то значение длины пароля очень облегчает атаку перебором. Знание, что пароль содержит всего 5 символов, позволяет хакеру ограничить число попыток подбора пароля, необходимых для взлома пароля.

Решение получше – хранить длину пароля в составе зашифрованной строки. Длину пароля можно добавить к началу строки пароля (например, как первые два символа). При расшифровке пароля по первым двум символам восстанавливается длина, и пароль безопасно обрезается. Хранение длины, зашифрованной вместе с паролем, гарантирует, что никто не может иметь доступ к длине пароля без знания тайны, используемой для шифрования пароля.

Пример – Хранение длины и обрезание паролей

Хранение сообщения вместе с длиной:

// Кодируется длина как первые 4 байта
// Данные находятся в строке «сообщение»
byte length = new byte;

length = (byte)((message.Length >> 8) & 0xFF);
length = (byte)((message.Length >> 16) & 0xFF);
length = (byte)((message.Length >> 24) & 0xFF);

Восстановление сообщения из двоичного массива:

// Хранилище для незашифрованного сообщения

// Используется для преобразования массива байтов в строку
// с конкретной кодировкой

//Читаются данные из зашифрованного потока.
// Первые 4 байта – фактическая длина
// остальное - сообщение + дополнение
byte length = new byte;
// Читаются данные из расшифрованного потока
csDecrypt.Read(length, 0, 4);

<< 8) |
(length << 16) | (length << 24);


// Строка обрезается до заданной длины, чтобы удалить
// дополнение
// textConverter по умолчанию - UTF8

Соление – соль улучшает вкус всего

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

Простое соление – использование дополнительного куска данных

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

Пользователь: Bob
Пароль: Snake
Хешированный пароль: hash(“Snake”) -> k468dD8F
Пользователь: Eve
Пароль: Snake
Хешированный пароль: hash(“Snake”) -> k468dD8F

Разумеется, Боб и Ив имеют одинаковый пароль. Еще хуже, если хакер получит хранилище паролей, хакер сможет заранее вычислить хеши для всего словаря и искать совпадения в хранилище паролей, сильно ускорив процесс взлома.

Если добавить логин в сочетание:

Пользователь: Bob
Пароль: Snake
Хешированный пароль: hash(“Bob.Snake”) -> 4Fgja93Q
Пользователь: Eve
Пароль: Snake
Хешированный пароль: hash(“Eve.Snake”) -> k468dD8F

Сейчас Боб и Ив имеют разные хеши паролей. Если хакер завладеет хранилищем паролей, теперь хакеру придется вычислить хеш каждого пароля конкретно для каждого пользователя. Хакеру придется заранее вычислить словарные хеши с префиксом “Bob.” для Боба и с префиксом “Eve.” для Ив – нелегкая задача.

Продвинутое соление – использование случайной информации

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

Чтобы использовать случайную соль, вычислите случайное число и используйте случайное число как компонент при вычислении хеша или при шифровании. Храните случайное число в столбце базы данных, чтобы число было доступно позже при проверке пароля.

Например:

// Генерируется 6-байтовая соль
public static byte GenerateSALT()
{
byte data = new byte;
new System.Security.Cryptography.RNGCryptoServiceProvider().GetBytes(data);
return data;
}

При первоначальном сохранении пароля для Боба:

1. Вычислить случайное число (использовать надежный криптографический случайный генератор, такой как в System.Security.Cryptography).


4. Сохранить хеш или результат шифрования и случайное число в хранилище паролей.

При сравнении паролей следовать такому же алгоритму:

1. Достать случайное число из хранилища паролей.
2. Добавить случайное число к строке пароля.
3. Вычислить хеш или зашифровать полученную строку.
4. Сравнить результат с сохраненным хешем или зашифрованным паролем, совпадение означает совпадение паролей.

Использование случайного числа лучше, чем использование логина. Логины не очень случайны – они придерживаются очень строгих правил. Случайные числа (исходящие из надежного криптографического генератора случайных чисел) вносят больше случайности в полученный хеш или зашифрованные выходные данные. Заметьте, что если в качестве соли используется логин, то логин вообще нельзя менять. При изменении логина хеш станет недействительным.

Кодирование двоичных выходных данных в виде текста

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

Две популярные схемы кодирования - UUENCODE (популярна в мире Unix) и Base64 (популярна везде). Base64 – схема кодирования, применяемая для преобразования двоичных вложений для отправки через электронную почту SMTP(простой протокол пересылки почты).

Пример – кодирование двоичного массива в строку

//Получить зашифрованный массив байтов.

// Преобразовать в строку Base64
string b64 = Convert.ToBase64String(encrypted);

Пример – раскодирование строки в двоичный массив

// Раскодировать Base64
// данные находятся в строке ‘b64’
byte encrypted = Convert.FromBase64String(b64);

Алгоритмы шифрования и примеры

Каркас.NET (System.Security.Cryptography) включает в себя встроенную поддержку нескольких алгоритмов шифрования:

DES – старый, вышедший из употребления.
TripleDES – старый, но все еще стойкий.
RC2 – старый, но все еще полезный.
Rijndael (AES) - современный.

Пример – кодирование строки:

// Кодируется строка ‘message(сообщение)’
// ScrambleKey и ScambleIV случайно генерируются
// RC2CryptoServiceProvider rc2 = new RC2CryptoServiceProvider();
// rc2.GenerateIV();
// ScrambleIV = rc2.IV;
// rc2.GenerateKey();
// ScrambleKey = rc2.Key
UTF8Encoding textConverter = new UTF8Encoding();
RC2CryptoServiceProvider rc2CSP =
new RC2CryptoServiceProvider();

//Данные преобразуются в массив байтов.
byte toEncrypt = textConverter.GetBytes(message);

//Получается шифратор.
ICryptoTransform encryptor =
rc2CSP.CreateEncryptor(ScrambleKey, ScrambleIV);

//Шифруются данные.
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt,
encryptor, CryptoStreamMode.Write);

//Все данные записываются в криптопоток, и он сбрасывается.
//Длина кодируется в виде первых 4 байтов
byte length = new byte;
length = (byte)(message.Length & 0xFF);
length = (byte)((message.Length >> 8) & 0xFF);
length = (byte)((message.Length >> 16) & 0xFF);
length = (byte)((message.Length >> 24) & 0xFF);
csEncrypt.Write(length, 0, 4);
csEncrypt.Write(toEncrypt, 0, toEncrypt.Length);
csEncrypt.FlushFinalBlock();

//Получается зашифрованный массив байтов.
byte encrypted = msEncrypt.ToArray();

Пример – раскодирование строки:

// Раскодируется зашифрованный byte
UTF8Encoding textConverter = new UTF8Encoding();
RC2CryptoServiceProvider rc2CSP = new RC2CryptoServiceProvider();
//Получается дешифратор, использующий тот же ключ и проверку идентичности, что и шифратор.
ICryptoTransform decryptor =
rc2CSP.CreateDecryptor(ScrambleKey, ScrambleIV);

//Дешифруется ранее зашифрованное сообщение с помощью дешифратора,
// полученного в шаге выше.
MemoryStream msDecrypt = new MemoryStream(encrypted);
CryptoStream csDecrypt = new CryptoStream(msDecrypt,
decryptor, CryptoStreamMode.Read);

byte fromEncrypt = new byte;

//Читаются данные из криптопотока.
byte length = new byte;
csDecrypt.Read(length, 0, 4);
csDecrypt.Read(fromEncrypt, 0, fromEncrypt.Length);
int len = (int)length | (length << 8) |
(length << 16) | (length << 24);

//Массив байтов преобразуется обратно в строку.
return textConverter.GetString(fromEncrypt).Substring(0, len);

Алгоритмы хеширования и примеры

Каркас.NET (System.Security.Cryptography) включает в себя встроенную поддержку нескольких криптографических хеш-функций:

MD5 – взломан, старайтесь избегать.
RIPEMD160 – приемлем, вообще не популярен в США.
SHA1 – приемлем, но 160 битные выходные данные считаются слишком короткими.
SHA256 – рекомендуемый минимум.
SHA384 (SHA2) - рекомендуется.
SHA512 – очень надежен, но не обеспечивает дополнительной защиты в сравнении с SHA384.

Пример – хеширование строки:

Public byte EncryptPassword(string userName, string password,
int encryptionVersion, byte salt1, byte salt2)
{
string tmpPassword = null;

Switch(encryptionVersion)
{
case 2: // пароль + много соли
tmpPassword = Convert.ToBase64String(salt1)
+ Convert.ToBase64String(salt2)
+ userName.ToLower() + password;
break;
case 1: // логин в качестве соли
tmpPassword = userName.ToLower() + password;
break;
case 0: // без соли
default:
tmpPassword = password;
break;
}

//Строка пароля преобразуется в массив байтов.
UTF8Encoding textConverter = new UTF8Encoding();
byte passBytes = textConverter.GetBytes(tmpPassword);

//Возвращаются зашифрованные байты
if (encryptionVersion == 2)
return new SHA384Managed().ComputeHash(passBytes);
else
return new MD5CryptoServiceProvider().ComputeHash(passBytes);
}

Пример – сравнение двух хешей на равенство:

// Сравниваются два массива на равенство
// Можно добавить сравнение длины, но обычно
// размер всех хешей одинаков.
private bool PasswordsMatch(byte psswd1, byte psswd2)
{
try
{
for(int i = 0; i < psswd1.Length; i++)
{
if(psswd1[i] != psswd2[i])
return false;
}
return true;
}
catch(IndexOutOfRangeException)
{
return false;
}
}

Заключение

У вас уже есть достаточно информации, чтобы принимать обоснованные решения насчет хранения паролей.

Если надо восстанавливать пароли, используйте шифрование.
Если не надо восстанавливать пароли, используйте хеши (более безопасно).
Что бы вы ни делали, солите пароли.

Одними из наиболее важных свойств безопасности, используемых сегодня, являются пароли. Важно как вам так и вашим пользователям иметь безопасные, не очевидные пароли. Большинство из наиболее последних дистрибутивов Linux включают программу "passwd", которая не позволит вам установить легко угадываемый пароль. Убедитесь, что ваша программа "passwd" современна и имеет это свойство.

Глубокое обсуждение шифрования далеко за пределами целей этого документа, однако введение мы сделаем. Шифрование очень полезно, возможно даже необходимо в это время и в этом месте. Существует большое количество разных методов шифрования данных, каждый из которых имеет свой собственный набор характеристик.

Большинство Unix (и Linux не исключение) в основном используют односторонний алгоритм шифрования, называемый DES (стандарт шифрования данных /Data Encription Standard/), для шифрования ваших паролей. Эти зашифрованные пароли затем сохраняются (обычно) в файле /etc/passwd или (реже) в /etc/shadow. Когда вы пытаетесь зарегистрироваться, все, что вы набираете, снова шифруется и сравнивается с содержимым файла, в котором хранятся ваши пароли. Если они совпадают, должно быть это одинаковые пароли, и вам разрешают доступ. Хотя DES является двухсторонним (вы можете закодировать, а затем раскодировать сообщение, давая верный ключ), большинство Unix используют односторонний вариант. Это значит, что невозможно на основании содержания файла /etc/passwd (или /etc/shadow) провести расшифровку для получения паролей.

Атаки "методом грубой силы", такие как "Взлом" или "John the Ripper" (см. ниже), могут часто угадать ваш пароль, если он не достаточно случает (рандомизирован). PAM модули (см. ниже) позволяют вам использовать различные программы шифрования для ваших паролей (такие как MD5 или подобные).

Больше информации по криптографии можно найти в RSA cryptography FAQ, доступном на http://www.rsa.com/rsalabs/newfaq/ . Здесь вы найдете информацию по таким терминам как "Diffie-Hellman", "public-key cryptography", "Digital Certificates", и др.

6.2 SSL, S-HTTP, HTTPS и S/MIME

Очень часто пользователи спрашивают о различиях между различными протоколами безопасности и шифрования, и как использовать их. Поскольку это документ не о шифровании, будет неплохой идеей кратко объяснить что из себя каждый из них представляет, и где найти более детальную информацию.

  • SSL: - SSL, или Secure Sockets Layer, является методом шифрования разработанным Netscape для обеспечения безопасности в Сети. Он поддерживает несколько различных протоколов шифрования, и обеспечивает идентификацию (authentication) как на уровне клиента так и на уровне сервера. SSL работает на транспортном уровне, создает безопасный шифрованный канал данных, и, таким образом, может бесшовно шифровать данные многих типов. Наиболее часто это случается, когда вы посещаете защищенный узел для просмотра в режиме online секретного документа с помощью Communicator, который обеспечивает вас базовыми услугами безопасности связи, а также многими другими видами шифрования данных. Больше информации можно найти на http://www.consensus.com/security/ssl-talk-faq.html . Информация о других реализациях безопасности в Netscape, а также хорошая отправная точка по этим протоколам доступа по http://home.netscape.com/info/security-doc.html .
  • S-HTTP: - S-HTTP является еще одним протоколом, который реализует в Интернете сервис безопасности. Он был разработан для предоставления конфиденциальности, опознавания, сохранности, а также non-repudiability [ не спутайте с чем-либо еще ], в то же время имея механизмы управления многими ключами и криптографические алгоритмы путем выборочного согласования между участниками в каждой транзакции. S-HTTP ограничен специфическим программным обеспечением, которое реализует его, и шифрует каждое сообщение индивидуально. [ Из RSA Cryptography FAQ, стр. 138]
  • S/MIME: - S/MIME, или Secure Multipurpose Internet Mail Extension, является стандартом шифрования, используемым в электронной почте, или других типах сообщений в Интернете. Это открытый стандарт, который разработан RSA, и поэтому очень вероятно, что мы скоро увидим его в Linux. Больше информации по S/MIME можно найти по адресу http://home.netscape.com/assist/security/smime/overview.html .

6.3 Реализация IPSEC в x-ядре Linux

Наряду с CIPE и другими формами шифрования данных, существует также реализация IPSEC для Linux. IPSEC создан усилиями IETF для обеспечения криптографически безопасных соединений на уровне IP сети, который также предоставляет опознавание, сохранность, контроль доступа и конфиденциальность. Информацию по IPSEC и черновикам Интернета можно найти в http://www.ietf.org/html.charters/ipsec-charter.html . Там вы также можете найти ссылки на другие протоколы использующие управление ключами, на список рассылки и архивы IPSEC.

Реализация для Linux, которая была разработана в Университете Аризоны, использует объектно-ориентированную структуру для реализации сетевого протокола называемую х-ядро. Детальнее на http://www.cs.arizona.edu/xkernel/hpcc-blue/linux.html . В двух словах, х-ядро является методом передачи сообщений на уровне ядра, что позволяет более простую реализацию.

Как и с другими формами криптографии этот метод не распространяется с ядром из-за ограничений на экспорт.

6.4 SSH (Secure Shell), stelnet

SSH и stelnet - это программы, которые позволяют вам зарегистрироваться на удаленном сервере и иметь шифрованное соединение.

SSH является набором программ используемым как более безопасный заменитель для rlogin, rsh и rcp. Он использует криптографию открытого ключа для шифрования соединения между двумя машинами, а также для опознавания пользователей. Его можно использовать для безопасной регистрации на удаленном сервере или копировании данных между двумя машинами, в то же время предотвращая атаки путем присоединения посредине (session hijacking) и обманом сервера имен (DNS spoffing). Он предоставляет компрессию данных в вашем соединение и безопасное X11 соединение между двумя машинами. Домашнюю Web страницу SSH можно найти по адресу http://www.cs.hut.fi/ssh/

Вы также можете использовать SSH с вашей рабочей станции под Windows обращаясь к вашему Linux SSH серверу. Существует несколько бесплатных реализаций Windows клиентов, включая http://guardian.htu.tuwien.ac.at/therapy/ssh/ , а также коммерческую реализацию от DataFellows, на http://www.datafellows.com .

SSLeay является бесплатной реализацией протокола Secure Sockets Layer от Netscape и состоит из нескольких приложений, таких как Secure telnet, модуль для Apache, нескольких баз данных, а также нескольких алгоритмов, включая DES, IDEA и Blowfish.

Используя эту библиотеку был создан secure telnet, который выполняет шифрование через telnet соединение. В противовес SSH, stelnet использует SSL, Secure Sockets Layer протокол разработанный Netscape. Вы можете найти Secure telnet и Secure FTP начав с SSLeay FAQ, доступного на http://www.psy.uq.oz.au/~ftp/Crypto/

6.5 PAM - Pluggable Authentication Modules

Новые версии дистрибутива Red Hat распространяются с унифицированной схемой идентификации, называемой "PAM". PAM позволяет вам налету изменять ваши методы идентификации, требования, инкапсулировать все ваши локальные методы идентификации без перекомпиляции ваших программ. Описание настройки PAM выходит за рамки этого документа, поэтому за более детальной информацией сходите на web узел PAM. http://www.kernel.org/pub/linux/libs/pam/index.html

Вот несколько вещей, которые вы можете делать с PAM:

  • Использовать не-DES шифрование для ваших паролей. (делая их более устойчивыми к взлому методом "грубой силы")
  • Устанавливать лимиты на ресурсы для ваших пользователей, чтобы они не могли выполнить сервисную атаку (количество процессов, количество памяти, и т.п.)
  • На лету активизировать теневые пароли (shadow password) (см. ниже)
  • Разрешать определенным пользователям регистрироваться только в определенное время и/или с определенного места

За несколько часов установки и настройки вашей системы вы можете предотвратить много атак еще до их возниконовения. Например, используйте PAM для запрещения широкого использования в системе файлов.rhosts в домашних каталогах пользователей добавлением этих строк к /etc/pam.d/login:

# # Запретить для пользователей rsh/rlogin/rexec # login auth required pam_rhosts_auth.so no_rhosts

6.6 Криптографическая IP инкапсуляция (CIPE)

Главной целью этого программного обеспечения является предоставление средств для безопасной (против подслушивания, включая анализ трафика, и подставления поддельных сообщений) связи между подсетями через небезопасные пакетные сети, такие как Интернет.

CIPE шифрует данные на сетевом уровне. Шифруются пакеты, которые передаются между компьютерами в сети. Шифрующий код помещается недалеко от драйвера, который посылает и принимает пакеты.

Это не схоже с SSH, который шифрует данные по соединениям - на гнездовом уровне. В этом случае шифруется логическое соединение между программами, запущенными на разных машинах.

CIPE можно также использовать при тунелировании (tunnelling) для создания Виртуальных Частных Сетей (Virtual Private Networks). Преимущество низкоуровневого шифрования состоит в том, что оно позволяет прозрачную работу между двумя сетями, соединенными в VPN, без каких-либо изменений в программном обеспечении.

Выдержка из документации по CIPE:

IPSEC стандарты определяют набор протоколов, которые можно использовать (среди прочих) для построения шифрованных VPN. Однако, IPSEC является скорее тяжеловесным и сложным с большим количеством опций, реализация полного набора протоколов все еще редко используется и некоторые вещи (такие как управление ключами) еще не до конца решены. CIPE использует более простой подход, в котором многие вещи, которые можно параметризовать (такие как выбор текущего алгоритма шифрования), устанавливаются единожды во время инсталляции. Это ограничивает гибкость, но позволяет более простую (и поэтому эффективную, простую в отладке) реализацию.

Дальнейшую информацию можно найти на http://www.inka.de/~bigred/devel/cipe.html

Также как и с другими формами криптографии, он не распространяется с ядром по умолчанию ввиду экспортных ограничений.

6.7 Kerberos

Kerberos является идентификационной системой, разработанной по проекту Athena в MIT. Во время регистрации пользователя, Kerberos идентифицирует его (используя пароль) и предоставляет пользователю способ доказать его идентичность другим серверам и компьютерам разбросанным в сети.

Эта идентификация затем используется программами, такими как rlogin, для разрешения пользователю регистрации на других компьютерах без пароля (в месте.rhosts файла). Идентификация также используется почтовой системой для того чтобы гарантировать, что почта доставлена правильному адресату, а также для гарантии того, что посылающий является тем за кого себя выдает.

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

Вы можете найти больше информацию по Kerberos на http://www.veritas.com/common/f/97042301.htm а сам пакет на http://nii.isi.edu/info/kerberos/

6.8 Теневые пароли (Shadow passwords)

Теневые пароли означают сокрытие секретной информации о ваших шифрованных паролях от обыкновенных пользователей. Обычно эти шифрованные пароли находятся у вас в /etc/passwd и открыты всем для чтения. Таким образом на этот файл можно напустить программу-расшифровщик, чтобы попытаться определить значения паролей. Пакет shadow записывает информацию о паролях в файл /etc/shadow, который могут читать только привилегированные пользователи. Для того, чтобы активизировать теневые пароли вам необходимо убедиться, что все ваши утилиты, которым необходим доступ к паролям, скомпилированы с поддержкой теневых паролей. PAM (см. выше), кстати, позволяет вам просто подключить shadow модуль и не требует перекомпиляции программ. Вы можете также почитать Shadow-Password HOWTO для получения более детальной информации, если это вам конечно нужно. Он доступен на http://sunsite.unc.edu/LDP/HOWTO/Shadow-Password-HOWTO.html Сейчас он скорее условный и не требуется в дистрибутивах, поддерживающих PAM.

6.9 "Crack" и "John the Ripper"

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

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

Существует целый ряд таких программ... наиболее заметные из них это "Crack" and "John the Ripper" http://www.false.com/security/john/index.html . Конечно, они заберут много вашего процессорного времени, но вы сможете с уверенностью сказать, сможет ли взломщик с помощью них получить ваши пароли, - сначала себе, а затем и пользователям указать слабые пароли. Заметьте, что взломщик для получения passwd должен был бы сначала использовать другие дыры в системе, но это уже более широкий вопрос, чем вы можете подумать.

6.10 CFS - криптографическая файловая система и TCFS - прозрачная криптографическая файловая система

CFS - это метод шифрования всей файловой системы, который позволяет пользователям сохранять в ней зашифрованные файлы. Он использует NFS сервер, запущенный на локальной машине. RPMS доступен на http://www.replay.com/redhat/ и больше информации о том как это работает на: ftp://ftp.research.att.com/dist/mab/

TCFS является улучшенным вариантом CFS, поскольку более интегрирован с файловой системой, и, таким образом, прозрачен для всех пользователей, использующих зашифрованную файловую систему. Более детально на: http://edu-gw.dia.unisa.it/tcfs/

6.11 X11, SVGA и экранная безопасность

X11

Очень важно для вас защитить ваш графический экран, чтобы предотвратить взломщика от действий подобных: воровству вашего пароля во время набора без вашего ведома, чтению документов или информации, оставленной вами на экране, или даже использованию дыр для получения прав суперпользователя. Запуск удаленных Х приложений через сеть также может быть чреват опасностями, давая возможность взломщику (зд. sniffer) перехватить ваше взаимодействие с удаленным компьютером.

Х имеет целый ряд механизмов контроля доступа. Наиболее простой из них - машинозависимый (host based). Вы можете использовать xhost для определения тех машин, с которых разрешен доступ к вашему экрану. Но в общем это не очень безопасный метод. Если кто-то имеет доступ к вашей машине, он может выполнить xhost + его машина и, таким образом, легко войти. Также, если вам нужно разрешить доступ с ненадежной машины, любой может подвергнуть риску ваш дисплей.

Вы можете также использовать ssh (см. ssh выше) для разрешения безопасных Х соединений. Это имеет также преимущество, поскольку прозрачно конечному пользователю, и означает то, что не зашифрованные данные не передаются по сети.

Загляните также в Xsecurity страничку man для более детального описания безопасности в Х. Безопасным будет использовать xdm для регистрации на вашей консоли, а затем использовать ssh для перехода на удаленную машину, с которой вы хотите запустить X программу.

SVGA

Программы, основанные на SVGAlib, обычно являются SUID-root, для того чтобы иметь доступ ко всем видео-ресурсам вашего компьютера. Это делает их очень опасными. Если они дают сбой, то обычно вам нужно перезагрузить компьютер, чтобы опять получить доступ к консоли. Убедитесь, что все SVGA программы, которые вы запускаете, подлинны, и как минимум такие, которым вы доверяете. А лучше - не запускайте их вообще.

GGI (проект Общего Графического Интерфейса)

Проект GGI для Linux является попыткой решить несколько проблем с видео интерфейсом в Linux. GGI будет передавать небольшие куски видео-кода в ядро Linux, и таким образом контролировать доступ к видео системе. Это значит, что GGI будет способен восстановить вашу консоль в любое время к известному рабочему состоянию. Он также позволит использовать ключ безопасности (secure attention key), так что вы сможете быть уверены, что на вашей консоли нет ни одного запущенного "Троянского коня", пытающегося зарегистрироваться.



Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png