91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android使用KeyStore對數據進行加密的示例代碼

發布時間:2020-10-24 16:27:11 來源:腳本之家 閱讀:194 作者:子不語歸來 欄目:移動開發

談到 Android 安全性話題,Android Developers 官方網站給出了許多很好的建議和講解,涵蓋了存儲數據、權限、網絡、處理憑據、輸入驗證、處理用戶數據、加密等方方面面

密鑰的保護以及網絡傳輸安全 應該是移動應用安全最關鍵的內容。Android 提供大量用來保護數據的加密算法,例如 Cipher 類中提供了 AES 和 RSA 算法,再例如安全隨機數生成器 SecureRandom 給 KeyGenerator 提供了更加可靠的初始化參數,避免離線攻擊等等。

而如果需要存儲密鑰以供重復使用,Android 提供了 KeyStore 等可以長期存儲和檢索加密密鑰的機制,Android KeyStore 系統特別適合于存儲加密密鑰。”AndroidKeyStore” 是 KeyStore 的一個子集,存進 AndroidKeyStore 的 key 將受到簽名保護,并且這些 key 是存在系統里的,而不是在 App 的 data 目錄下,依托于硬件的 KeyChain 存儲,可以做到 private key 一旦存入就無法取出,總之,每個 App 自己創建的 key,別的應用是訪問不到的。

KeyStore 提供了兩個能力:

有了這兩個能力,我們的密鑰保護就變得很容易了,你只需要:

在應用安裝后第一次運行時,生成一個隨機密鑰,并存入 KeyStore

當你想存儲一個數據,便從 KeyStore 中取出之前生成的隨機密鑰,對你的數據進行加密,加密完成后,已完成加密的數據可以隨意存儲在任意地方,比如 SharePreferences,此時即使它被他人讀取到,也無法解密出你的原數據,因為他人取不到你的密鑰

當你需要拿到你的原數據,只需要從 SharePreferences 中讀取你加密后的數據,并從 KeyStore 取出加密密鑰,使用加密密鑰對 “加密后的數據” 進行解密即可

其中加密算法可以使用 Cipher AES 來保證安全性,不要使用自己創造的加密算法。

這就是使用 KeyStore 的一整套流程,另外 KeyStore 還可以用來做數據簽名和簽名驗證,就像一個黑匣子一樣,具體可以自行搜索了解。

KeyStore 適于存儲運行時生產獲取到的數據,比如運行時,用戶輸入的密碼,或者服務端傳下來的 token,但無法用于存儲我們需要預設在 App 內的 API key / secret,對于這類需要預設的固定密鑰,我將介紹一種十分安全、難破解的保護方式。

加密:

public String encryptString(String needEncryptWord, String alias) {
    if(!"".equals(alias)&&!"".equals(needEncryptWord)){
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        initKeyStore(alias);
      }
      String encryptStr="";
      byte [] vals=null;
      try {
        KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
//      RSAPublicKey publicKey = (RSAPublicKey) privateKeyEntry.getCertificate().getPublicKey();
        if(needEncryptWord.isEmpty()) {
//        Toast.makeText(this, "Enter text in the 'Initial Text' widget", Toast.LENGTH_LONG).show();
          return encryptStr;
        }

//      Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
        Cipher inCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//      inCipher.init(Cipher.ENCRYPT_MODE, publicKey);
        inCipher.init(Cipher.ENCRYPT_MODE, privateKeyEntry.getCertificate().getPublicKey());

        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        CipherOutputStream cipherOutputStream = new CipherOutputStream(
            outputStream, inCipher);
        cipherOutputStream.write(needEncryptWord.getBytes("UTF-8"));
        cipherOutputStream.close();

        vals = outputStream.toByteArray();
      } catch (Exception e) {
        e.printStackTrace();
      }
      return Base64.encodeToString(vals, Base64.DEFAULT);
    }
    return "";
  }

解密:

public String decryptString(String needDecryptWord, String alias) {
    if(!"".equals(alias)&&!"".equals(needDecryptWord)){
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        initKeyStore(alias);
      }
      String decryptStr="";
      try {
        KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry(alias, null);
//      RSAPrivateKey privateKey = (RSAPrivateKey) privateKeyEntry.getPrivateKey();

//      Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding", "AndroidOpenSSL");
        Cipher output = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//      output.init(Cipher.DECRYPT_MODE, privateKey);
        output.init(Cipher.DECRYPT_MODE, privateKeyEntry.getPrivateKey());
        CipherInputStream cipherInputStream = new CipherInputStream(
            new ByteArrayInputStream(Base64.decode(needDecryptWord, Base64.DEFAULT)), output);
        ArrayList<Byte> values = new ArrayList<>();
        int nextByte;
        while ((nextByte = cipherInputStream.read()) != -1) {
          values.add((byte)nextByte);
        }

        byte[] bytes = new byte[values.size()];
        for(int i = 0; i < bytes.length; i++) {
          bytes[i] = values.get(i).byteValue();
        }

        decryptStr = new String(bytes, 0, bytes.length, "UTF-8");
      } catch (Exception e) {
        e.printStackTrace();
      }
      return decryptStr;
    }
    return "";
  }

源碼下載地址,我已經將加密解密封裝進了工具類,并對Android 7.0的兼容也處理了

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

都昌县| 金堂县| 微博| 台山市| 新丰县| 宜阳县| 浦北县| 胶南市| 舒兰市| 建水县| 厦门市| 江达县| 延津县| 稻城县| 磴口县| 桃江县| 石柱| 曲沃县| 顺昌县| 定日县| 呼图壁县| 衡水市| 民丰县| 古浪县| 安塞县| 祁连县| 昭通市| 板桥市| 东城区| 五指山市| 连平县| 珲春市| 延边| 原阳县| 邯郸市| 梅州市| 肃南| 丹巴县| 万载县| 海淀区| 克什克腾旗|