Android 常用的數據加密方式

前言

Android 很多場合需要使用到數據加密,比如:本地登錄密碼加密,網絡傳輸數據加密,等。在android 中一般的加密方式有如下:

  1. 亦或加密
  2. AES加密
  3. RSA非對稱加密

當然還有其他的方式,這里暫且介紹以上三種加密算法的使用方式。

亦或加密算法

什么是亦或加密?

  • 亦或加密是對某個字節進行亦或運算,比如字節 A^K = V,這是加密過程;
  • 當你把 V^K得到的結果就是A,也就是 V^K = A,這是一個反向操作過程,解密過程。
  • 亦或操作效率很高,當然亦或加密也是比較簡單的加密方式,且亦或操作不會增加空間,源數據多大亦或加密后數據依然是多大。

示例代碼如下:

/*** 亦或加解密,適合對整個文件的部分加密,比如文件頭部,和尾部* 對file文件頭部和尾部加密,適合zip壓縮包加密** @param source 需要加密的文件* @param det    加密后保存文件名* @param key    加密key*/public static void encryptionFile(File source, File det, int key) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(det); int size = 2048; byte buff[] = new byte[size]; int count = fis.read(buff); /**zip包頭部加密*/ for (int i = 0; i < count; i++) { fos.write(buff[i] ^ key); } while (true) { count = fis.read(buff); /**zip包結尾加密*/ if (count < size) { for (int j = 0; j < count; j++) { fos.write(buff[j] ^ key); } break; } fos.write(buff, 0, count); } fos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * 亦或加解密,適合對整個文件加密 * * @param source 需要加密文件的路徑 * @param det 加密后保存文件的路徑 * @param key 加密秘鑰key */ private static void encryptionFile(String source, String det, int key) { FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(det); int read; while ((read = fis.read()) != -1) { fos.write(read ^ key); } fos.flush(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }

?

總結:

  1. 可以對文件的部分加密,比如zip壓縮包,就可以對頭部和尾部加密,因為zip頭部和尾部藏有文件壓縮相關的信息,所有,我們只對頭部和尾部采用亦或加密算法,即可對整個zip文件加密,當你不解密試圖加壓是會失敗的。
  2. 也可以對整個文件進行亦或加密算法,所以你解密的時候其實是一個逆向的過程,使用同樣的方法同樣的key即可對加密的文件解密。當然以后加密的安全性可想而知,不是很安全,所以,亦或加密算法一般使用在不太重要的場景。由于亦或算法很快,所以加密速度也很快。

AES加密加密算法

什么是AES 加密

  • AES 對稱加密
  • 高級加密標準(英語:Advanced Encryption Standard,縮寫:AES),在密碼學中又稱Rijndael加密法,是美國聯邦政府采用的一種區塊加密標準。 這個標準用來替代原先的DES,已經被多方分析且廣為全世界所使用。
  • Android 中的AES 加密 秘鑰 key 必須為16/24/32位字節,否則拋異常

示例代碼:

  private static final String TAG = "EncryptUtils";private final static int MODE_ENCRYPTION = 1; private final static int MODE_DECRYPTION = 2; private final static String AES_KEY = "xjp_12345!^-=42#";//AES 秘鑰key,必須為16位 private static byte[] encryption(int mode, byte[] content, String pwd) { try { Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");//AES加密模式,CFB 加密模式 SecretKeySpec keySpec = new SecretKeySpec(pwd.getBytes("UTF-8"), "AES");//AES加密方式 IvParameterSpec ivSpec = new IvParameterSpec(pwd.getBytes("UTF-8")); cipher.init(mode == MODE_ENCRYPTION ? Cipher.ENCRYPT_MODE : Cipher.DECRYPT_MODE, keySpec, ivSpec); return cipher.doFinal(content); } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException e) { e.printStackTrace(); Log.e(TAG, "encryption failed... err: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); Log.e(TAG, "encryption1 failed ...err: " + e.getMessage()); } return null; } /** * AES 加密 * * @param source 需要加密的文件路徑 * @param dest 加密后的文件路徑 */ public static void encryptByAES(String source, String dest) { encryptByAES(MODE_ENCRYPTION, source, dest); } public static void encryptByAES(int mode, String source, String dest) { Log.i(TAG, "start===encryptByAES"); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(dest); int size = 2048; byte buff[] = new byte[size]; byte buffResult[]; while ((fis.read(buff)) != -1) { buffResult = encryption(mode, buff, AES_KEY); if (buffResult != null) { fos.write(buffResult); } } Log.i(TAG, "end===encryptByAES"); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "encryptByAES failed err: " + e.getMessage()); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } /** * AES 解密 * * @param source 需要解密的文件路徑 * @param dest 解密后保存的文件路徑 */ public static void decryptByAES(String source, String dest) { encryptByAES(MODE_DECRYPTION, source, dest); } 

?

總結:
AES對稱加密,加解密相比于亦或加密還是有點復雜的,安全性也比亦或加密高,AES加密不是絕對的安全。

RSA非對稱加密

什么是Rsa加密?

RSA算法是最流行的公鑰密碼算法,使用長度可以變化的密鑰。RSA是第一個既能用于數據加密也能用于數字簽名的算法。

RSA的安全性依賴于大數分解,小于1024位的N已經被證明是不安全的,而且由于RSA算法進行的都是大數計算,使得RSA最快的情況也比DES慢上倍,這是RSA最大的缺陷,因此通常只能用于加密少量數據或者加密密鑰,但RSA仍然不失為一種高強度的算法。

代碼示例:

 /*************************************************** 1.什么是RSA 非對稱加密?* <p>* 2.*************************************************/private final static String RSA = "RSA"; //加密方式 RSA public final static int DEFAULT_KEY_SIZE = 1024; private final static int DECRYPT_LEN = DEFAULT_KEY_SIZE / 8;//解密長度 private final static int ENCRYPT_LEN = DECRYPT_LEN - 11;//加密長度 private static final String DES_CBC_PKCS5PAD = "DES/CBC/PKCS5Padding";//加密填充方式 private final static int MODE_PRIVATE = 1;//私鑰加密 private final static int MODE_PUBLIC = 2;//公鑰加密 /** * 隨機生成RSA密鑰對,包括PublicKey,PrivateKey * * @param keyLength 秘鑰長度,范圍是 512~2048,一般是1024 * @return KeyPair */ public static KeyPair generateRSAKeyPair(int keyLength) { try { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(keyLength); return kpg.genKeyPair(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); return null; } } /** * 得到私鑰 * * @return PrivateKey * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */ public static PrivateKey getPrivateKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { byte[] privateKey = Base64.decode(key, Base64.URL_SAFE); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey); KeyFactory kf = KeyFactory.getInstance(RSA); return kf.generatePrivate(keySpec); } /** * 得到公鑰 * * @param key * @return PublicKey * @throws NoSuchAlgorithmException * @throws InvalidKeySpecException */ public static PublicKey getPublicKey(String key) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException { byte[] publicKey = Base64.decode(key, Base64.URL_SAFE); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey); KeyFactory kf = KeyFactory.getInstance(RSA); return kf.generatePublic(keySpec); } /** * 私鑰加密 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptByRSA(byte[] data, Key key) throws Exception { // 數據加密 Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.ENCRYPT_MODE, key); return cipher.doFinal(data); } /** * 公鑰解密 * * @param data 待解密數據 * @param key 密鑰 * @return byte[] 解密數據 */ public static byte[] decryptByRSA(byte[] data, Key key) throws Exception { // 數據解密 Cipher cipher = Cipher.getInstance(RSA); cipher.init(Cipher.DECRYPT_MODE, key); return cipher.doFinal(data); } public static void encryptByRSA(String source, String dest, Key key) { rasEncrypt(MODE_ENCRYPTION, source, dest, key); } public static void decryptByRSA(String source, String dest, Key key) { rasEncrypt(MODE_DECRYPTION, source, dest, key); } public static void rasEncrypt(int mode, String source, String dest, Key key) { Log.i(TAG, "start===encryptByRSA mode--->>" + mode); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(source); fos = new FileOutputStream(dest); int size = mode == MODE_ENCRYPTION ? ENCRYPT_LEN : DECRYPT_LEN; byte buff[] = new byte[size]; byte buffResult[]; while ((fis.read(buff)) != -1) { buffResult = mode == MODE_ENCRYPTION ? encryptByRSA(buff, key) : decryptByRSA(buff, key); if (buffResult != null) { fos.write(buffResult); } } Log.i(TAG, "end===encryptByRSA"); } catch (IOException e) { e.printStackTrace(); Log.e(TAG, "encryptByRSA failed err: " + e.getMessage()); } catch (Exception e) { e.printStackTrace(); } finally { try { if (fis != null) { fis.close(); } if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } }

?

總結:
1.AES公鑰加密,私鑰解密
2.AES加密耗時
3.AES加密后數據會變大

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

oracle可以注入嗎,ORACLE 注入

1判斷是什么數據庫and exist(select * from dual)and exists(select * from user_tables)原理&#xff1a;dual表和user_tables表是oracle中的系統表返回正常&#xff0c;那么就可以肯定這是oracle。2查字段數order by 10-- //錯誤,列數小于10order by 3-- //正常,列數等于…

centos升級glibc(升級到 2.17版)

1、原先的系統glibc庫的版本是2.12&#xff0c;需要升級到2.17版本。 下載地址&#xff1a; http://ftp.gnu.org/gnu/glibc/ http://ftp.gnu.org/gnu/glibc/glibc-2.17.tar.gz 這里可以選擇你所需要的版本。 2、安裝部署 [rootkafzook1 common]# tar -xf glibc-2.17.tar.g…

Day31 python基礎--網絡編程基礎-socketserver

一&#xff0c;驗證客戶端合法性 #server端 import os import hmac import socket secret_key balex_sbdef auth(conn):msg os.urandom(32) #生成一個隨機的字符串conn.send(msg) #發送到client端result hmac.new(secret_key,msg) #處理這個隨機字符串&#xff0c;得到一…

康樂php一鍵腳本,kangle一鍵腳本

腳本簡介1、本腳本是可以一鍵安裝kangleEasypanelmysql商業集合腳本。2、腳本本身集成&#xff1a;PHP5.3、PHP5.4、PHP5.5、PHP5.6、PHP7.1、PHP7.2、PHP7.3、MYSQL5.63、支持前臺用戶任意切換PHP5.3-7.3以適應網站程序Kangle一鍵腳本特點1.安裝包內PHP套件以及Kangle套件均已…

oracle data guard方案,Oracle Data Guard 概念篇

一個Data Guard 配置由一個生產庫和一個或者多個standby數據庫組成&#xff0c;在Data Guard配置中&#xff0c;主庫和備庫都既可以是rac環境&#xff0c;也可以是單機環境。這篇文章主要介紹dataguard的一些基本知識dataguard的分類、dataguard的服務類型、dataguard的保護模式…

洛谷P4133 [BJOI2012]最多的方案(記憶化搜索)

題意 題目鏈接 求出把$n$分解為斐波那契數的方案數&#xff0c;方案兩兩不同的定義是分解出來的數不完全相同 Sol 這種題&#xff0c;直接爆搜啊。。。 打表后不難發現$<1e18$的fib數只有88個 最先想到的應該是直接把$n$加入到搜索狀態里&#xff0c;然后枚舉能被分成哪些 但…

centos一鍵安裝redmine

官網給出的環境要求&#xff1a; http://www.redmine.org/projects/redmine/wiki/RedmineInstall#Requirements ------------------------------------------------------------------------------------------------------------- 下載一鍵安裝&#xff1a;&#xff08;下載…

大話php設計模式視頻,大話PHP設計模式

工廠模式用工廠方法或者類來實例化對象&#xff0c;而不是直接new。首先我們需要創建一個工廠類&#xff0c;比如Factory.php。如果不使用工廠模式的&#xff0c;我們需要一個對象的時候通常需要new Inexistence\girlfriend();然而我們一般不只在一個地方需要這個對象&#xff…

Git 2.19 對Diff、Branch和Grep等做了改進

\Git的最新版帶來了豐富的新功能以及內部更新&#xff0c;包括改進的diff、branch和grep&#xff0c;更好的命令行補全&#xff0c;新的range-diff命令等。\\Git diff現在可以正確地標記以intent-to-add參數添加的新文件路徑。intent-to-add可以和git add命令一起使用&#xff…

su oracle c expdp,expdp/impdp 數據泵導入導出

useridtest/test --導出的用戶&#xff0c;本地用戶!!directorydmpfile --導出的邏輯目錄&#xff0c;一定要在oracle中創建完成的&#xff0c;并且給用戶授權讀寫權限dumpfilexx.dmp --導出的數據文件的名稱&#xff0c;如果想在指定的位置的話可以寫…

Centos 升級GLIBCXX3.4.25

32位系統: http://ftp.de.debian.org/debian/pool/main/g/gcc-4.7/libstdc6_4.7.2-5_i386.deb 64位系統: wget http://ftp.de.debian.org/debian/pool/main/g/gcc-8/libstdc6_8.2.0-7_amd64.deb 其他版本 http://ftp.de.debian.org/debian/pool/main/g/ 解壓 ar -x libst…

美團點評基于MGR的CMDB高可用架構搭建之路【轉】

王志朋 美團點評DBA 曾在京東金融擔任DBA&#xff0c;目前就職于美團點評&#xff0c;主要負責金融業務線數據庫及基礎組件數據庫的運維。 MySQL Group Replication&#xff08;以下簡稱MGR&#xff09;&#xff0c;于5.7.17版本正式GA&#xff0c;由Oracle官方出品&#xff0c…

使用 redmind 進行項目任務管理

一、項目經理 1.1、新建任務(工單) 1.2、查看任務狀態 二、團隊成員 2.1、查看任務 作為這個團隊的成員之一&#xff0c;每天開工第一件事便是進入redmine查看“我的工作臺”中自己的任務 2.2、每日反饋任務完成狀態 1、每天開始工作時&#xff0c;及時將任務狀態從“新…

oracle11g創建表空間大文件,oracle11g創建表空間 sql語法

--oracle 11g創建有限制大小的永久表空間--create tablespace test--datafile F:\app\shan\product\11.2.0\dbhome_1\oradata\test.dbf size 1M--autoextend on next 2M maxsize 1024M;--修改表空間大小&#xff1a;--alter database datafile F:\app\shan\product\11.2.0\dbho…

內存泄漏優化

目錄介紹&#xff1a; 1.什么是內存泄漏2.內存泄漏造成什么影響3.內存泄漏檢測的工具有哪些4.關于Leakcanary使用介紹5.Leakcanary捕捉常見的內存泄漏及解決辦法 5.0.1 錯誤使用單例造成的內存泄漏5.0.2 錯誤使用靜態變量&#xff0c;導致引用后無法銷毀5.0.3 [常見]Handler使用…

redmine更換主題

主題列表&#xff1a;http://www.redmine.org/projects/redmine/wiki/Theme_List 雖然有很多主題&#xff0c;但是很多主題都是要錢的&#xff0c;像這類&#xff08;上圖&#xff09;沒有下載地址的&#xff0c;都是要錢的。 含GitHub的下載地址的&#xff0c;是免費可下載的&…

redmine 郵箱配置(阿里云+windows)

說明 密碼是第三方的授權碼&#xff0c;不是郵箱密碼 需要登錄126網頁版&#xff0c;在設置里開啟 smtp 等第三方服務&#xff0c;設置授權碼 阿里云Linux 默認屏蔽25號端口&#xff0c;所以需要開啟ssl&#xff0c;和使用 465 端口 重啟下 redmind sh /opt/redmine-3.4.6-…

linux查看當前用戶終端,Linux----基本命令的使用(vi命令,查看文件內容,顯示進程,切換用戶等)...

1、vi是linux系統上經常使用的一個文本編輯器&#xff0c;其有三種模式&#xff1a;命令模式、編輯模式(插入模式)、末行模式。命令模式——>編輯模式&#xff1a;“i a o I A O”linux編輯模式——>命令模式&#xff1a;“ESC”shell命令模式——>末行模式&#xff1…

centos6.8 環境一鍵安裝包 nginx配置thinkphp5

---恢復內容開始--- lnmp1.4 一鍵安裝包 nginx配置thinkphp5 環境&#xff1a;Nginx1.12.1 PHP5.6 Coentos6.8 修改網站配置文件 server{listen 443 ssl http2;#listen [::]:443 ssl http2;server_name xxx.cn;index index.html index.htm index.php default.html default.ht…

Linux下BitNami Redmine的插件安裝與更新

截至2017年3月27日&#xff0c;Redmine-3.3.2-2安裝以下的15款插件全部成功并通過測試&#xff08;下面顯示為插件正確文件夾名&#xff09;&#xff1a; easy_wbs redmine_ckeditor 提供所見即所得編輯器 redmine_graphs 提供部分問題圖表功能 progressive_projects_list 是…