如何在android中加密数据?

时间:2010-06-04 06:53:37

标签: android

我是android新手。我正在努力学习和研究它。有人可以帮助我解决以下问题。 我有一些字段要加密并使用android上传到数据库。 应加密的字段是DOB,电子邮件ID,电话号码和一些其他数字值。 现在我通过替换进行一些正式的加密。 有人可以用一个例子来帮助我做一些标准的加密形式。

2 个答案:

答案 0 :(得分:0)

有很多加密库,但它取决于您使用的语言。对于Java,请看一下:http://www.androidsnippets.com/encryptdecrypt-strings

或使用Google搜索

  

android + encryption + library +< your programming language>

答案 1 :(得分:0)

我认为最大的挑战是使用什么加密以及如何保密密钥安全。无论您要加密哪些数据或要将其存储在何处都无关紧要。关键必须保密。并且您需要能够使用完全相同的密钥来解密数据。

您无法将密钥与数据本身一起存储。即使不在受保护的应用资源中也是如此。一些替代方案:

从服务中获取密钥

从远程服务获取密钥(以安全的方式)。这增加了保护该通信渠道的挑战,但如果可能的话,它可能是一种有效的方法。

以下代码示例可与其他地方检索到的密钥一起使用。只需检查加密和解密部分代码即可。

使用密码派生密钥

另一种选择是使用来自用户的秘密输入(也称为密码)来生成密钥。生成密钥的方法将始终为每个唯一密码返回相同的密钥。因此,如果用户输入密码,您可以恢复密钥。

理想情况下,永远不会存储此密码,并且始终会针对每个加密/解密需求提示。这也依赖于用户的正确密码选择。

显示某些示例数据的密钥生成,加密和解密的代码示例。请注意我们如何不使用密钥生成的默认设置。

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设备上提供的新功能。更多信息可以在this blog post找到。我从那里添加了一个片段:

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;
}