Запутался в том, как работает шифрование Android

Хорошо, я работаю над приложением и хочу сохранить файл на SD-карте пользователя, но я хочу, чтобы файл был зашифрован. Я изучил несколько сайтов, которые используют шифрование DES для шифрования файлов и данных, но что-то меня смущает. Во всех примерах, которые я видел, используется такая строка:

SecretKey key = KeyGenerator.getInstance("DES").generateKey();

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


person Icemanind    schedule 15.05.2011    source источник
comment
Также учтите, что если вы публикуете приложение на Android Market с шифрованием ключа AES 128 или 256 бит, вы должны подтвердить, что соблюдаете законы страны.   -  person JAL    schedule 15.05.2011


Ответы (3)


Я думаю, что есть два случая:

  1. Вы доверяете пользователю - пусть ключ зависит от некоторого ввода (пароль/парольная фраза). и шифровать/расшифровывать данные с его помощью.

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

Это относится как к симметричному, так и к асимметричному шифрованию.

person MByD    schedule 15.05.2011
comment
Я доверяю пользователю и хотел бы, чтобы ключ зависел от пароля, но как мне это сделать? похоже, что метод generateKey() не позволяет вводить пароль. - person Icemanind; 15.05.2011
comment
После того, как вы сгенерировали ключ (используя указанные вами методы), зашифровали его с помощью парольной фразы, которую вы получили от пользователя, и сохранили ее в БД (или где вы хотите), я уточню через 2-3 часа. - person MByD; 15.05.2011
comment
Да, я все это получил. Мне неясно, как зашифровать его с помощью парольной фразы, которую вы получаете от пользователя. Как это делается в Android? - person Icemanind; 15.05.2011

Прежде всего, пожалуйста, не используйте DES. Она сломана много лет назад. Вместо этого используйте AES.

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

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

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

Да, кто-то мог это сделать.

Maybe I am missing something, but is there a way to generate a key using a supplied pass phrase?

Вы не используете ключ с кодовой фразой. Обычно вы делаете следующие вещи:

  1. генерация ключей
  2. зашифровать ключ, сгенерированный с помощью симметричного ключа, полученного из парольной фразы

И почему кто-то не захочет использовать ключ доступа, если он должен хранить сгенерированный ключ где-то еще?

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

РЕДАКТИРОВАТЬ:

чтобы сгенерировать ключ из пароля, посмотрите PBKDF2 (похожий пост).

person Heisenbug    schedule 15.05.2011

Да, для шифрования можно использовать парольную фразу.

Но сначала сбросьте DES. Используйте AES-128.

Примите парольную фразу от пользователя и сгенерируйте хэш, используя SHA-256 или SHA-512. Обрежьте хэш до 128 бит для AES-128. Обратитесь к этому сообщению.

Java AES и использование моего собственного ключа

По возможности используйте соль.

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

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

Надеюсь, поможет.

person Andrew Anderson    schedule 15.07.2011