【问题标题】:how to encrypt data in android?如何在android中加密数据?
【发布时间】:2010-06-04 06:53:37
【问题描述】:

我是安卓新手。我正在努力学习和努力。有人可以帮我解决以下问题。 我有一些字段要加密并使用 android 上传到数据库。 应该加密的字段是 DOB、Email id、电话号码和其他一些数值。 现在我正在通过替换进行一些正式的加密。 有人可以帮我举个例子来做一些标准形式的加密吗?

【问题讨论】:

    标签: android database encryption


    【解决方案1】:

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

    或者使用谷歌搜索

    android +encryption +library +

    【讨论】:

      【解决方案2】:

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

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

      从服务中获取密钥

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

      下面的代码示例可以与在别处检索到的密钥一起使用。只需检查代码的加密和解密部分。

      使用密码派生密钥

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

      理想情况下,永远不会存储此密码,并且在每次加密/解密需要时始终提示输入。这也依赖于用户选择正确的密码。

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

      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。我从那里添加了一个 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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-11
        相关资源
        最近更新 更多