Шифрование пароля для входа для использования на нескольких устройствах

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

У меня есть приложение, в котором есть поля, зашифрованные с использованием класса AES (который я нашел опубликованным здесь в другом вопросе), а зашифрованная строка затем сохраняется в файле XML. Теперь пароль, используемый для шифрования каждой строки, предоставляется пользователем и устанавливается при первом использовании программы. Эта часть работает нормально, и я могу отлично шифровать и расшифровывать данные, как хочу.

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

Проблема в том, что это отлично работает на компьютере, на котором создан пароль, но как только я пытаюсь использовать его на другом компьютере, DPAPI выдает ошибку (я полагаю, потому что DPAPI зависит от машины?)

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

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

Я надеюсь, что это имело смысл, моя голова болит!!!!

Любая помощь очень ценится

Дополнительная информация:

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

Дублирующий вопрос: вопрос отличается, потому что в их случае DPAPI делает то, что им требуется, в моем случае НЕ ДЕЛАЕТ, как я уже выразил в своем исходном вопросе!


person Craig    schedule 06.07.2016    source источник
comment
Почему вы храните его в файле конфигурации? Разве вы не можете хранить эту конфиденциальную информацию в базе данных? Кроме того, как сделать так, чтобы пользователь мог войти с другого устройства, если пароль хранится в исходном файле конфигурации пользователя?   -  person Matias Cicero    schedule 06.07.2016
comment
Спасибо, Матиас. Приложение представляет собой очень простое приложение winform, которое позволяет получить доступ к данным при вводе правильного пароля, а программа хранится на USB-накопителе, что позволяет подключать ее к любому компьютеру, а данные расшифровывать и просматривать. Здесь нет пользовательской структуры, вам просто нужен правильный пароль для доступа к приложению и просмотра данных. Пароль, используемый для доступа к приложению, является паролем, используемым для шифрования данных.   -  person Craig    schedule 06.07.2016
comment
Вы можете хранить пароль в зашифрованном файле вместо файла конфигурации. Файл конфигурации должен быть простым текстом.   -  person Matias Cicero    schedule 06.07.2016
comment
Возможно, пусть пользователь снова вводит пароль для каждого нового устройства.   -  person Magnus    schedule 06.07.2016
comment
Пароль, который они вводят при настройке, используется для шифрования данных. Таким образом, чтобы расшифровать данные на другой машине, им нужно ввести пароль, которым они были изначально зашифрованы (это работает нормально). Проблема в том, что мне нужен способ сохранить пароль для входа, который используется для шифрования, чтобы его можно было использовать на любое устройство.   -  person Craig    schedule 06.07.2016


Ответы (2)


Вы не сохраняете пароль. Вы просите пользователя предоставить его.

person Remus Rusanu    schedule 06.07.2016
comment
Но я должен проверить правильность пароля, который пользователь предоставляет для доступа к данным. Пользователь вводит пароль при первом запуске программы. Это шифрует любые данные, которые они вводят, используя этот пароль и соль. Когда они в следующий раз откроют приложение, им будет предложено ввести пароль для просмотра данных. Их просят предоставить пароль только один раз. - person Craig; 06.07.2016
comment
Проверка пароля тривиальна: если данные расшифровываются правильно, пароль правильный. Добавьте HMAC к сохраненным данным, чтобы проверить их. Сохранение пароля невозможно сделать безопасным способом. - person Remus Rusanu; 06.07.2016
comment
Поскольку вы отметили dpapi: да, вы можете использовать роуминг учетных данных DPAPI для шифрования на одном компьютере и расшифровки на другом. Но только в пределах домена и пароли не используются, так как все шифрование делегировано DPAPI. - person Remus Rusanu; 06.07.2016
comment
Но в этом суть DPAPI прекрасно работает на 1 машине. Мне нужно, чтобы шифрование работало на ЛЮБОЙ машине, поэтому я перешел на AES, поскольку казалось, что DPAPI зависит от машины. Я что-то зашифровал в DPAPI на одной машине, а на другой не читал. В контексте того, что я пытаюсь сделать, проверка пароля не является тривиальной, поскольку она используется не только для расшифровки данных, но и для доступа к программе. Как я уже сказал, все работает нормально, мне просто нужен способ защитить пароль для входа. Думаю, я рассмотрю другие методы выполнения того, что мне нужно (может быть, хэширование?). В любом случае спасибо за помощь. - person Craig; 06.07.2016
comment
Вам нужен новый и лучший DPAPI: CNG-DPAPI Этот новый API, называемый DPAPI-NG, позволяет безопасно обмениваться секретами (ключами, паролями, материалом ключа) и сообщениями, защищая их с помощью набора принципалов, которые могут быть используется для снятия защиты с них на разных компьютерах после надлежащей аутентификации и авторизации. Пользователь по-прежнему вводит пароль, но не вам, для сеанса входа в Windows. - person Remus Rusanu; 06.07.2016
comment
Спасибо, Ремус, я посмотрю на это. Вы дали мне пищу для размышлений с ответом «Не хранить пароль». Возможно, когда они создают пароль при первой настройке, вместо того, чтобы хранить пароль, я могу сохранить фразу, зашифрованную с помощью этого пароля, т.е. правильный пароль, и, как вы говорите, проверьте, расшифровывается ли фраза. Если это так, то пароль явно правильный, если нет, то явно неправильный. Есть над чем подумать, спасибо - person Craig; 06.07.2016

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

При первой настройке попросите пользователя ввести пароль, хешируйте его с помощью БЕЗОПАСНОЙ хеш-функции (из семейства SHA-2) и сохраните шифр Hash(Plain password)=Cipher Позже, когда вы захотите зашифровать или аутентифицироваться, сделайте это с помощью шифра. Таким образом, вы можете сохранить безопасную копию паролей на своем устройстве, не закрывая пароль пользователя, и по-прежнему использовать строку, специфичную для пользователя, для шифрования данных.

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

person Modus Ponens    schedule 06.07.2016
comment
Фактически вы сохраняете открытый текстовый ключ вместе с зашифрованными данными. Зачем вообще шифровать, если ключ дешифрования уже есть? - person Remus Rusanu; 06.07.2016
comment
Как я понял вопрос, программа будет на USB-накопителе, а информация будет храниться на указанном компьютере, поэтому она не будет на том же устройстве. - person Modus Ponens; 06.07.2016