2011-02-05 3 views
31

Im в настоящее время разрабатывает структуру для доступа к веб-сервисам oAuth 1 и 2, и мой вопрос заключается в том, как безопасным образом хранить конфиденциальные данные, такие как ключ доступа oAuth? Проблема с этими ключами заключается в том, что на некоторых платформах, таких как твиттер, используется постоянный ключ, и если кто-то получит доступ к этому ключу, он может делать все, что захочет, с учетной записью пользователя Twitter.шифровать данные в SharedPreferences

так что можно автоматически шифровать данных до того, как они будут сохранены в общих настройках? Или есть лучший способ/место для хранения очень важных данных?

ОБНОВЛЕНИЕ - ТАКЖЕ ЧИТАЙТЕ: What is the most appropriate way to store user settings in Android application

+1

http://stackoverflow.com/a/6393502/82156 – emmby

+0

Прочитайте это, это даст вам гораздо больше представления об этом http://stackoverflow.com/a/20560574/730807 –

ответ

32

1). Как зашифровать?

На Android шифрование выполняется через Java Cryptography Architecture (JCA). В основном это пакет javax.crypto.*.

JCA Reference Guide

Вот example использования API JCA (AES alrorithm, в частности).

2). Где хранить?

API шифрования манипулирует массивами байтов (не строк). Это означает, что вы можете использовать SharedPreferences, но вам нужно будет применить кодировку Base-64 в зашифрованном массиве байтов, прежде чем помещать ее в SharedPreferences (иначе синтаксический анализатор XML не сможет прочитать файл общих настроек). Затем, чтобы прочитать, вам нужно будет использовать декодирование Base-64. Обратите внимание, что по умолчанию большинство версий ОС Android не имеют встроенного в Base-64 API (см. Раздел UPDATE). Поэтому, чтобы удалить эту нагрузку Base-64, я бы рекомендовал просто хранить ваши байты в private file.

UPDATE: С API уровня 8 API имеет android.util.Base64.

50

Вы также можете посмотреть на этот класс, я сделал для этого именно это: https://github.com/sveinungkb/encrypted-userprefs

Он использует AES вместо устаревших и слабых DES используется в другом предложении.

+3

Спасибо. Это было очень необходимо. Я думаю, что если вы добавите JavaDocs, это будет еще более удивительно. :) – Sufian

+2

Я посмотрю, что Суфиан, спасибо! –

+0

Спасибо, что разделили ваши усилия ... :) –

0

This article на CodeProject содержит хорошую оболочку для общих префов. Однако имя класса SecurePreferences вводит в заблуждение что-то вроде ObfuscatedPreferences.

3

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

Бонус! Недавно я собрал головоломку о том, как вы можете использовать ее у Xamarin - см. Мою статью о securing your C# app's data using conceal для получения дополнительной информации.

0

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

Вы можете посмотреть в библиотеке, делать это https://github.com/ophio/secure-preferences

1

Попробуйте использовать наш https://github.com/BottleRocketStudios/Android-Vault Vault компонент. Он будет использовать Keystore от Android (на поддерживаемых устройствах) или метод Obfuscation для шифрования значений в файле SharedPreference и реализует интерфейс SharedPreference, поэтому он в значительной степени заменяется на замену.

3

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

Итак, я искал библиотеку, которая даст мне более эффективный процесс шифрования, и я нашел Slink. Slink использует библиотеку Conceal от Facbook, чтобы сохранить всю карту объектов в целом, что делает ее наиболее эффективным и быстрым решением шифрования SharedPreferences. Он также использует общие интерфейсы SharedPreferences от Android, что делает использование чрезвычайно простым и практически без проблем. Отказ от ответственности: Я являюсь частью группы разработчиков, разрабатывающей эту библиотеку.

Смежные вопросы