亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android使用KeyStore對(duì)數(shù)據(jù)進(jìn)行加密的示例代碼

 更新時(shí)間:2017年01月21日 08:53:14   作者:子不語(yǔ)歸來(lái)  
這篇文章主要介紹了Android使用KeyStore對(duì)數(shù)據(jù)進(jìn)行加密的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

談到 Android 安全性話題,Android Developers 官方網(wǎng)站給出了許多很好的建議和講解,涵蓋了存儲(chǔ)數(shù)據(jù)、權(quán)限、網(wǎng)絡(luò)、處理憑據(jù)、輸入驗(yàn)證、處理用戶數(shù)據(jù)、加密等方方面面

密鑰的保護(hù)以及網(wǎng)絡(luò)傳輸安全 應(yīng)該是移動(dòng)應(yīng)用安全最關(guān)鍵的內(nèi)容。Android 提供大量用來(lái)保護(hù)數(shù)據(jù)的加密算法,例如 Cipher 類中提供了 AES 和 RSA 算法,再例如安全隨機(jī)數(shù)生成器 SecureRandom 給 KeyGenerator 提供了更加可靠的初始化參數(shù),避免離線攻擊等等。

而如果需要存儲(chǔ)密鑰以供重復(fù)使用,Android 提供了 KeyStore 等可以長(zhǎng)期存儲(chǔ)和檢索加密密鑰的機(jī)制,Android KeyStore 系統(tǒng)特別適合于存儲(chǔ)加密密鑰?!盇ndroidKeyStore” 是 KeyStore 的一個(gè)子集,存進(jìn) AndroidKeyStore 的 key 將受到簽名保護(hù),并且這些 key 是存在系統(tǒng)里的,而不是在 App 的 data 目錄下,依托于硬件的 KeyChain 存儲(chǔ),可以做到 private key 一旦存入就無(wú)法取出,總之,每個(gè) App 自己創(chuàng)建的 key,別的應(yīng)用是訪問(wèn)不到的。

KeyStore 提供了兩個(gè)能力:

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

在應(yīng)用安裝后第一次運(yùn)行時(shí),生成一個(gè)隨機(jī)密鑰,并存入 KeyStore

當(dāng)你想存儲(chǔ)一個(gè)數(shù)據(jù),便從 KeyStore 中取出之前生成的隨機(jī)密鑰,對(duì)你的數(shù)據(jù)進(jìn)行加密,加密完成后,已完成加密的數(shù)據(jù)可以隨意存儲(chǔ)在任意地方,比如 SharePreferences,此時(shí)即使它被他人讀取到,也無(wú)法解密出你的原數(shù)據(jù),因?yàn)樗巳〔坏侥愕拿荑€

當(dāng)你需要拿到你的原數(shù)據(jù),只需要從 SharePreferences 中讀取你加密后的數(shù)據(jù),并從 KeyStore 取出加密密鑰,使用加密密鑰對(duì) “加密后的數(shù)據(jù)” 進(jìn)行解密即可

其中加密算法可以使用 Cipher AES 來(lái)保證安全性,不要使用自己創(chuàng)造的加密算法。

這就是使用 KeyStore 的一整套流程,另外 KeyStore 還可以用來(lái)做數(shù)據(jù)簽名和簽名驗(yàn)證,就像一個(gè)黑匣子一樣,具體可以自行搜索了解。

KeyStore 適于存儲(chǔ)運(yùn)行時(shí)生產(chǎn)獲取到的數(shù)據(jù),比如運(yùn)行時(shí),用戶輸入的密碼,或者服務(wù)端傳下來(lái)的 token,但無(wú)法用于存儲(chǔ)我們需要預(yù)設(shè)在 App 內(nèi)的 API key / secret,對(duì)于這類需要預(yù)設(shè)的固定密鑰,我將介紹一種十分安全、難破解的保護(hù)方式。

加密:

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

源碼下載地址,我已經(jīng)將加密解密封裝進(jìn)了工具類,并對(duì)Android 7.0的兼容也處理了

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Androd 勇闖高階性能優(yōu)化之布局優(yōu)化篇

    Androd 勇闖高階性能優(yōu)化之布局優(yōu)化篇

    Android性能優(yōu)化方面也有很多文章了,這里就做一個(gè)總結(jié),從原理到方法,工具等做一個(gè)簡(jiǎn)單的了解,從而可以慢慢地改變編碼風(fēng)格,從而提高性能
    2021-10-10
  • android使用TextView實(shí)現(xiàn)跑馬燈效果

    android使用TextView實(shí)現(xiàn)跑馬燈效果

    這篇文章主要為大家詳細(xì)介紹了android使用TextView實(shí)現(xiàn)跑馬燈效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • Android中切換到主線程執(zhí)行的方法

    Android中切換到主線程執(zhí)行的方法

    這篇文章主要介紹了Android中切換到主線程執(zhí)行的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Android中實(shí)現(xiàn)EditText密碼顯示隱藏的方法

    Android中實(shí)現(xiàn)EditText密碼顯示隱藏的方法

    這篇文章主要介紹了Android中實(shí)現(xiàn)EditText密碼顯示隱藏的方法,需要的朋友可以參考下
    2017-01-01
  • Android Intent基礎(chǔ)用法及作用詳解

    Android Intent基礎(chǔ)用法及作用詳解

    Intent是一種重要的消息傳遞對(duì)象,用于在不同組件(如活動(dòng)(Activity)、服務(wù)(Service)、廣播接收器(BroadcastReceiver)等)之間進(jìn)行通信和交互,本文介紹Android Intent基礎(chǔ)用法及作用,感興趣的朋友一起看看吧
    2024-07-07
  • android監(jiān)聽(tīng)安裝和卸載示例

    android監(jiān)聽(tīng)安裝和卸載示例

    Android應(yīng)用程序的安裝和卸載事件,是由系統(tǒng)進(jìn)行監(jiān)聽(tīng)并全局廣播的,支持1.5(android 3)以上,因此,如果想要監(jiān)聽(tīng)獲取應(yīng)用的安裝和卸載事件,只需要自定義一個(gè)BroadcastReceiver,來(lái)對(duì)系統(tǒng)廣播進(jìn)行監(jiān)聽(tīng)和處理
    2014-02-02
  • php 異步調(diào)用方法實(shí)現(xiàn)示例

    php 異步調(diào)用方法實(shí)現(xiàn)示例

    客戶端與服務(wù)器端是通過(guò)HTTP協(xié)議進(jìn)行連接通訊,客戶端發(fā)起請(qǐng)求,服務(wù)器端接收到請(qǐng)求后執(zhí)行處理,并返回處理結(jié)果
    2014-01-01
  • Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    Android使用Notification實(shí)現(xiàn)寬視圖通知欄(二)

    這篇文章主要為大家詳細(xì)介紹了Android使用Notification實(shí)現(xiàn)寬視圖通知欄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • Android 通過(guò)jni返回Mat數(shù)據(jù)類型方法

    Android 通過(guò)jni返回Mat數(shù)據(jù)類型方法

    今天小編就為大家分享一篇Android 通過(guò)jni返回Mat數(shù)據(jù)類型方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • 使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果

    使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果

    這篇文章主要為大家詳細(xì)介紹了使用TransitionDrawable實(shí)現(xiàn)多張圖片淡入淡出效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-08-08

最新評(píng)論