Android常用加解密算法總結

Android開發中對于數據的傳輸和保存一定會使用加密技術,加密算法是最普遍的安保手段,多數情況數據加密后在需要使用源數據時需要再進行解密,但凡是都有例外。下面從可逆加密、不可逆、不純粹加密三種方式記錄一下常見的加解密算法。

加密技術包括兩個元素:算法和密鑰:算法使用密鑰將明文數據變成無法辨識的密文。

以下代碼是點擊事件里調用SecurityUtil工具類,加解密算法都再SecurityUtil中實現。

1、可逆加密:分為對稱加密和非對加密

1.1對稱加密

加密和解密使用的同一套密鑰,包括:DES、3DES、AES等

以AES為例:

被加密的明文public static final String CONTENT = "suibianxie888888888";密鑰public static final String SECRET_KEY = "6a8w0c91kc7";
public static final String SECRET_KEY_PREFIX = "aw098";aesTv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {try {String encryptAES = SecurityUtil.encryptAES( CONTENT, SECRET_KEY+SECRET_KEY_PREFIX);Log.e(TAG, "onClick: encryptAES= "+encryptAES );String value = SecurityUtil.decryptAES(encryptAES, SECRET_KEY+SECRET_KEY_PREFIX);Log.e(TAG, "onClick: decryptAES = "+value);}catch (Exception e){Log.e(TAG, "onClick: decryptAES -Exception= "+e.getMessage() );}}
});

????/*** AES加密* @throws Exception ?此處實際有好多個Exception,偷懶直接拋Exception了*/public static String encryptAES(String data, String secretKey) {try {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(secretKey.getBytes());cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);byte[] bEncData = cipher.doFinal(data.getBytes());
// ???????????return com.android.api.utils.Base64.encode(bEncData);return Base64.encodeToString(bEncData, Base64.NO_WRAP);} catch (Exception e) {e.printStackTrace();return "";}}/*** AES 解密* @param cipherText* @param secretKey* @return* @throws Exception*/
public static String decryptAES(String cipherText, String secretKey){try {byte[] encrypted1 = Base64.decode(cipherText, Base64.NO_WRAP);Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKeySpec keySpec = new SecretKeySpec(secretKey.getBytes(), "AES");IvParameterSpec ivSpec = new IvParameterSpec(secretKey.getBytes());cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);byte[] original = cipher.doFinal(encrypted1);String originalString = new String(original);return originalString;} catch (Exception e) {e.printStackTrace();return null;}
}

AES加密和解密日志打印:

1.2??非對稱加密

加密和解密分別使用不同的密鑰,包括:SM2、SM4、RSA

2、不可逆加密

無解,理論上誰都別想解開,包括:MD5、SHA系列,MD5和SHA系列,SHA-1之外的SHA系列稱作SHA2算法,SHA系列比MD5安全性更高而SHA2的都高于SHA-1。SHA-x 后面的x代表加密后的字符串長度,SHA-1加密后固定160位。常用于用戶密碼和文件完整性校驗。

2.1 MD5加密

擁有以下特質:

壓縮性:無論多大加密后都生成128位(16字節)的數據,通常用它的16進制字面值輸出是一個32位長度的字符串; ?

容易計算性質:通過原數據很容易計算出MD5值; ??

抗修改性:隨便修改一個字節重新計算的MD5值千差萬別; ??

抗碰撞性:知道數據和MD5值,很小概率找到相同MD5值的原數據。

public static final String CONTENT = "suibianxie888888888";md5Tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Log.e(TAG, "onClick: md5Tv-string= "+ SecurityUtil.encryptMD5(CONTENT) );Log.e(TAG, "onClick: md5Tv-bytes1= "+SecurityUtil.encryptMD5Bytes(CONTENT.getBytes()) );}
});
// 16進制下數字到字符的映射數組
public static String[] hexDigits = new String[] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9","a", "b", "c", "d", "e", "f" };// 對字符串進行MD5編碼
public static String encryptMD5(String originstr) {if (originstr != null) {return encryptMD5Bytes(originstr.getBytes());}else {return null;}
}public static String encryptMD5Bytes(byte[] originstr) {if (originstr != null) {try {// 創建具有指定算法名稱的信息摘要MessageDigest md = MessageDigest.getInstance("MD5");// 使用指定的字節數組對摘要進行最后的更新,然后完成摘要計算byte[] results = md.digest(originstr);// 將得到的字節數組編程字符串返回String resultString = byteArrayToHexString(results);return resultString.toUpperCase();} catch (Exception ex) {ex.printStackTrace();}}return null;
}// 轉換字節數組為十六進制字符串
public static String byteArrayToHexString(byte[] b) {StringBuffer resultsb = new StringBuffer();int i = 0;for (i = 0; i < b.length; i++) {resultsb.append(byteToHexString(b[i]));}return resultsb.toString();
}
//以下代碼是對字符串進行MD5加密的相關代碼// 將字節轉化成十六進制的字符串
private static String byteToHexString(byte b) {int n = b;if (n < 0) {n = 256 + n;}int d1 = n / 16;int d2 = n / 16;return hexDigits[d1] + hexDigits[d2];
}

MD5日志:

SHA1和SHA256:

public static final String CONTENT = "suibianxie888888888";sha1Tv.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//SHA1算法String fileSHA1 = SecurityUtil.getFileSHA1(CONTENT);Log.e(TAG, "onClick: ?sha1Tv="+fileSHA1 );//SHA256算法String sha_256 = SecurityUtil.SHA_256(CONTENT);Log.e(TAG, "onClick: ?sha_256="+sha_256 );}
});

// 獲取文件的SHA1值
public static String getFileSHA1(String text) {if (text.isEmpty()){return "";}try{text = text.trim();byte[] bytes = text.getBytes("UTF-8");return getFileSHA1(bytes);}catch (Exception e){return "";}
}// 獲取文件的SHA1值
public static String getFileSHA1(byte[] bytes) {StringBuffer strResult = new StringBuffer();MessageDigest md;try {md = MessageDigest.getInstance("SHA-1");md.update(bytes);byte[] encryptedBytes = md.digest();String stmp;for (int n = 0; n < encryptedBytes.length; n++) {stmp = (Integer.toHexString(encryptedBytes[n] & 0XFF));if (stmp.length() == 1) {strResult.append("0");strResult.append(stmp);} else {strResult.append(stmp);}}return strResult.toString();} catch (Exception e) {return "";}
}/*** SHA加密* @param strText 明文* @return*/
public static String SHA_256(final String strText){// 返回值String strResult = null;// 是否是有效字符串if (strText != null && strText.length() > 0){try{// SHA 加密開始MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");// 傳入要加密的字符串messageDigest.update(strText.getBytes());byte byteBuffer[] = messageDigest.digest();StringBuffer strHexString = new StringBuffer();for (int i = 0; i < byteBuffer.length; i++){String hex = Integer.toHexString(0xff & byteBuffer[i]);if (hex.length() == 1){strHexString.append('0');}strHexString.append(hex);}strResult = strHexString.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}}return strResult;
}

SHA1和SHA256算法日志打印:

3、不純粹加密

Base64,經它運算后表面看是變形了,但不屬于真的加密,開發中也經常遇到。一種不算嚴格意義上的加解密,把字符串轉換成以"=="雙等號結尾的串。

未完結,持續更新中。

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

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

相關文章

【使用sudo apt-get出現報錯】——無法獲得鎖 /var/lib/dpkg/lock-open(11:資 源暫時不可用) ,是否有其他進程正占用它?

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、ubuntu中進程正在被占用1. 問題描述2. 原因分析3. 解決 總結 前言 一、ubuntu中進程正在被占用 1. 問題描述 在Ubuntu中&#xff0c;使用終端時輸入帶有…

C++函數不完整聲明報錯

擋在c中聲明如下的函數代碼段時&#xff0c;不會進行隱式的轉換。 double add(); int main(){double s add(1,2);return 0; } double add(double a,double b){return ab; } 在調用add時&#xff0c;main中為它提供了兩個參數&#xff0c;看起來可以被轉換成double類型。然而…

昇思25天學習打卡營第7天之二 | 模型保存與加載

1. 保存與加載 在訓練網絡模型的過程中&#xff0c;實際上我們希望保存中間和最后的結果&#xff0c;用于微調&#xff08;fine-tune&#xff09;和后續的模型推理與部署&#xff0c;本章節我們將介紹如何保存與加載模型。 1.1 導入依賴 # 導入numpy庫&#xff0c;并將其重命…

六月,允許自己做自己,別人做別人

今天結束后&#xff0c;2024 就過去一半了。 年初的規劃完成一半了嗎&#xff1f;如果沒有也沒關系&#xff0c;做你自己繼續前進。 家人來北京旅游&#xff0c;我累趴了 六月初&#xff0c;我搬家了&#xff0c;這次租了一整套房&#xff0c;是一個小倆居、還帶一個小閣樓。…

速盾:視頻cdn和網站cdn的相同點與不同點

CDN&#xff08;Content Delivery Network&#xff09;是一種分布式網絡架構&#xff0c;旨在為用戶提供高效、高質量的內容傳送服務。CDN主要通過將內容分發到全球各地的邊緣節點&#xff0c;并根據用戶的地理位置選擇最近的節點來提供內容&#xff0c;從而加速內容的傳輸并降…

【高考志愿】儀器科學與技術

目錄 一、專業介紹 1.1 專業概述 1.2 專業方向 1.3 主要課程 二、專業技能與素質培養 三、就業前景 四、個人發展規劃建議 五、儀器科學與技術專業排名 六、總結 一、專業介紹 1.1 專業概述 儀器科學與技術專業是一門綜合性極強的學科&#xff0c;它融合了測量、控制…

數學學習與研究雜志社《數學學習與研究》雜志社2024年第6期目錄

課改前沿 基于核心素養的高中數學課堂教學研究——以“直線與圓、圓與圓的位置關系”為例 張亞紅; 2-4 核心素養視角下初中生數學閱讀能力的培養策略探究 賈象虎; 5-7 初中數學大單元教學實踐策略探索 耿忠義; 8-10《數學學習與研究》投稿&#xff1a;cn7kantougao…

使用Python繪制極坐標圖

使用Python繪制極坐標圖 極坐標圖極坐標圖的優點使用場景 效果代碼 極坐標圖 極坐標圖&#xff08;Polar Chart&#xff09;是一種圖表類型&#xff0c;用于顯示在極坐標系中的數據。極坐標圖使用圓形坐標系&#xff0c;角度表示一個變量的值&#xff0c;半徑表示另一個變量的…

線程安全問題(二)——死鎖

死鎖 前言可重入鎖邏輯 兩個線程兩把鎖&#xff08;死鎖&#xff09;死鎖的特點多個線程多把鎖&#xff08;哲學家就餐問題&#xff09;總結 前言 在前面的文章中&#xff0c;介紹了鎖的基本使用方式——鎖 在上一篇文章中&#xff0c;通過synchronized關鍵字進行加鎖操作&am…

XML簡介XML 使用教程XML的基本結構XML的使用場景

學習總結 1、掌握 JAVA入門到進階知識(持續寫作中……&#xff09; 2、學會Oracle數據庫入門到入土用法(創作中……&#xff09; 3、手把手教你開發炫酷的vbs腳本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA編程利器技巧(編寫中……&#xff09; 5、面經吐血整理的 面試技…

VMware每次打開網絡設置都出現需要運行NetworkManager問題

每次打開都出現這個情況&#xff0c;是因為之前把NetworkManager服務服務關閉&#xff0c;重新輸入命令&#xff1a; sudo systemctl start NetworkManager.service或者 sudo service network-manager restart 即可解決&#xff0c;但是每次開機重啟都要打開就很麻煩&#xf…

【Chapter4】匯編語言及其程序設計,《微機系統》第一版,趙宏偉

一、匯編語言概述 **指令&#xff1a;**指使計算機完成某種操作的命令。 **程序&#xff1a;**完成某種功能的指令序列。 **軟件&#xff1a;**各種程序總稱。 **機器語言&#xff1a;**計算機能直接識別的語言。用機器語言寫出的程序稱為機器代碼。 **匯編語言&#xff1…

Forecasting from LiDAR via Future Object Detection

Forecasting from LiDAR via Future Object Detection 基礎信息 論文&#xff1a;cvpr2022paper https://openaccess.thecvf.com/content/CVPR2022/papers/Peri_Forecasting_From_LiDAR_via_Future_Object_Detection_CVPR_2022_paper.pdfgithub&#xff1a;https://github.co…

SyncUnsafeCell替換Mutex提高性能

1. 背景 在Rust開發過程中&#xff0c;很多情況下需要在不可變的情況下獲取可變性或者在多線程的情況下可以安全的貢獻可變數據。這種情況下我們一般使用**Mutex來實現通過加鎖來實現。現在我們可以通過使用SyncUnsafeCell來替代Mutex**。 2. SyncUnsafeCell SyncUnsafeCell…

【計算機網絡——1.1網絡internet】

網絡 就是用通信線路和通信設備把很多個“主機/端設備“相互聯系。然后按照某種溝通方式&#xff0c;專業術語叫“協議”&#xff0c;共享信息。 **&#xff08; 計算機網絡&#xff1a;節點和邊構成的系統 節點&#xff1a; 主機節點&#xff1a;主機/端設備(手機&#x…

K8S之網絡深度剖析(一)(持續更新ing)

K8S之網絡深度剖析 一 、關于K8S的網絡模型 在K8s的世界上,IP是以Pod為單位進行分配的。一個Pod內部的所有容器共享一個網絡堆棧(相當于一個網絡命名空間,它們的IP地址、網絡設備、配置等都是共享的)。按照這個網絡原則抽象出來的為每個Pod都設置一個IP地址的模型也被稱作為I…

SpringBoot(一)創建一個簡單的SpringBoot工程

Spring框架常用注解簡單介紹 SpringMVC常用注解簡單介紹 SpringBoot&#xff08;一&#xff09;創建一個簡單的SpringBoot工程 SpringBoot&#xff08;二&#xff09;SpringBoot多環境配置 SpringBoot&#xff08;三&#xff09;SpringBoot整合MyBatis SpringBoot&#xff08;四…

3.ROS串口實例

#include <iostream> #include <ros/ros.h> #include <serial/serial.h> #include<geometry_msgs/Twist.h> using namespace std;//運行打開速度控制插件&#xff1a; rosrun rqt_robot_steering rqt_robot_steering //若串口訪問權限不夠&#xff1a…

詳解PEFT庫中LoRA源碼

前言 GitHub項目地址Some-Paper-CN。本項目是譯者在學習長時間序列預測、CV、NLP和機器學習過程中精讀的一些論文&#xff0c;并對其進行了中文翻譯。還有部分最佳示例教程。如果有幫助到大家&#xff0c;請幫忙點亮Star&#xff0c;也是對譯者莫大的鼓勵&#xff0c;謝謝啦~本…

讀書筆記-《Spring技術內幕》(三)MVC與Web環境

前面我們學習了 Spring 最核心的 IoC 與 AOP 模塊&#xff08;讀書筆記-《Spring技術內幕》&#xff08;一&#xff09;IoC容器的實現、讀書筆記-《Spring技術內幕》&#xff08;二&#xff09;AOP的實現&#xff09;&#xff0c;接下來繼續學習 MVC&#xff0c;其同樣也是經典…