我是android新手。我正在努力学习和研究它。有人可以帮助我解决以下问题。 我有一些字段要加密并使用android上传到数据库。 应加密的字段是DOB,电子邮件ID,电话号码和一些其他数字值。 现在我通过替换进行一些正式的加密。 有人可以用一个例子来帮助我做一些标准的加密形式。
答案 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设备上提供的新功能。更多信息可以在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;
}