Как зашифровать данные в Android? - PullRequest
0 голосов
/ 04 июня 2010

Я новичок в Android. Я пытаюсь учиться и работать над этим. Может кто-нибудь помочь мне в следующем вопросе. У меня есть некоторые поля для шифрования и загрузки в БД с помощью Android. Поля, которые должны быть зашифрованы: DOB, ID электронной почты, номер телефона и некоторые другие числовые значения Сейчас я делаю формальное шифрование путем подстановки. Может кто-нибудь помочь мне с примером сделать какую-то стандартную форму шифрования.

Ответы [ 2 ]

0 голосов
/ 10 декабря 2013

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

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

Получение ключа от услуги

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

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

Использование ключа, полученного из пароля

Другой вариант - использовать секретный ввод от пользователя (он же пароль) для генерации ключа. Метод, который генерирует ключ, всегда возвращает один и тот же ключ для каждого уникального пароля. Следовательно, вы можете восстановить ключ, если пользователь введет пароль.

В идеале этот пароль никогда не сохраняется и всегда запрашивается при каждой необходимости шифрования / дешифрования. Это также зависит от правильного выбора пароля от пользователя.

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

package com.example.android.secure;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;

public class EncryptionManager {

 // we should get a password from the user
 String password = "...";
 String PBE_ALGORITHM = "PBEWithSHA256And256BitAES-CBC-BC";
 // Important not to rely on default here !!!! use CBC instead of ECB
 String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding";
 int NUM_OF_ITERATIONS = 1000;
 int KEY_SIZE = 256;
 // generated on first run
 byte[] salt = "abababababababababa bab".getBytes();
 byte[] iv = "1234567890abcdef".getBytes();
 // This is the value to be encrypted.
 String clearText = "...";
 byte[] encryptedText;
 byte[] decryptedText;

 public void exampleCodeNoRealMethod() {
    try {
       PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray(), salt, NUM_OF_ITERATIONS, KEY_SIZE);
       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(PBE_ALGORITHM);
       SecretKey tempKey = keyFactory.generateSecret(pbeKeySpec);
       SecretKey secretKey = new SecretKeySpec(tempKey.getEncoded(), "AES");
       IvParameterSpec ivSpec = new IvParameterSpec(iv);
       Cipher encCipher = Cipher.getInstance(CIPHER_ALGORITHM);
       encCipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
       Cipher decCipher = Cipher.getInstance(CIPHER_ALGORITHM);
       decCipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
       encryptedText = encCipher.doFinal(clearText.getBytes());
       decryptedText = decCipher.doFinal(encryptedText);
       String sameAsClearText = new String(decryptedText);
    } catch (Exception e) { 
       // TODO handle this exception
    }
 }

}

Использование Android KeyStore

Это новая функция, доступная только на последних устройствах Android. Более подробную информацию можно найти в этом блоге . Я добавил оттуда фрагмент:

public static SecretKey generateKey(char[] passphraseOrPin, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
    // Number of PBKDF2 hardening rounds to use. Larger values increase
    // computation time. You should select a value that causes computation
    // to take >100ms.
    final int iterations = 1000; 

    // Generate a 256-bit key
    final int outputKeyLength = 256;

    SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    KeySpec keySpec = new PBEKeySpec(passphraseOrPin, salt, iterations, outputKeyLength);
    SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
    return secretKey;
}
0 голосов
/ 04 июня 2010

Существует множество библиотек шифрования, но это зависит от того, какой язык вы используете. Для Java, посмотрите здесь: http://www.androidsnippets.com/encryptdecrypt-strings.

Или используйте Google и найдите

android + шифрование + библиотека + <ваш язык программирования>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...