【发布时间】:2010-06-04 06:53:37
【问题描述】:
我是安卓新手。我正在努力学习和努力。有人可以帮我解决以下问题。 我有一些字段要加密并使用 android 上传到数据库。 应该加密的字段是 DOB、Email id、电话号码和其他一些数值。 现在我正在通过替换进行一些正式的加密。 有人可以帮我举个例子来做一些标准形式的加密吗?
【问题讨论】:
标签: android database encryption
我是安卓新手。我正在努力学习和努力。有人可以帮我解决以下问题。 我有一些字段要加密并使用 android 上传到数据库。 应该加密的字段是 DOB、Email id、电话号码和其他一些数值。 现在我正在通过替换进行一些正式的加密。 有人可以帮我举个例子来做一些标准形式的加密吗?
【问题讨论】:
标签: android database encryption
那里有很多加密库,但这取决于您使用的语言。对于 Java,请看这里:http://www.androidsnippets.com/encryptdecrypt-strings。
或者使用谷歌搜索
android +encryption +library +
【讨论】:
我认为最大的挑战是使用什么加密以及如何保证密钥的安全。您要加密什么数据或将其存储在哪里都没有关系。密钥必须保密。并且您需要能够使用完全相同的密钥来解密数据。
您不能将密钥与数据本身一起存储。即使不在受保护的应用资源中。一些替代方案:
从远程服务获取密钥(以安全的方式)。这增加了保护该通信渠道的挑战,但如果可能,这可能是一种有效的方法。
下面的代码示例可以与在别处检索到的密钥一起使用。只需检查代码的加密和解密部分。
另一种选择是使用来自用户的秘密输入(又名密码)来生成密钥。生成密钥的方法将始终为每个唯一密码返回相同的密钥。因此,如果用户输入密码,您可以恢复密钥。
理想情况下,永远不会存储此密码,并且在每次加密/解密需要时始终提示输入。这也依赖于用户选择正确的密码。
显示一些示例数据的密钥生成、加密和解密的代码示例。请注意我们如何不使用默认设置来生成密钥。
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 设备的新功能。更多信息请访问this blog post。我从那里添加了一个 sn-p:
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;
}
【讨论】: