android hxgsecurity 常用的集中加密方式封裝
阿新 • • 發佈:2018-12-06
hxgsecurity
引用方式
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.huangxiaoguo1:hxgsecurity:1.0.0'
}
MD5加密
計算字串MD5值
MD5Utils.md5(String string);
計算檔案的 MD5 值
MD5Utils.md5(File file );
採用nio的方式,計算檔案的 MD5 值
MD5Utils.md5Nio(File file);
對字串多次MD5加密
MD5Utils.md5(String string, int times);
MD5加鹽
MD5Utils.md5(String string, String slat);
Base64加密解密
字串進行Base64編碼加密
Base64Utils.encodeString(String str);
字串進行Base64解碼解密
Base64Utils.decodeString(String encodedString);
對檔案進行Base64編碼加密
Base64Utils.encodeFile(String path);
對檔案進行Base64解碼解密
Base64Utils.decodeFile(String encodedPath);
AES加密解密(這裡是常用的CBC模式)
Java層設定key和祕鑰預設偏移量
AESUtils.setJavaKey(String skey);
AESUtils.setJavaIvParameter(String ivParameter);
設定key必須為16位,可更改為自己的key ,例如:
AESUtils.setJavaIvParameter("huangxiaoguo1234");
AESUtils.setJavaKey("5682huangxiaoguo");
C層設定key和祕鑰預設偏移量
方式為進行NDK開發打包成.so檔案,放進你當前類對應的module的libs中,
並進行build.gradle配置
android {
...
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
}
jni對應的包名為cn.tsou.lib_security.aes
jni對應的獲取key的方法名為getKey()
jni對應的獲取IvParameter的方法名為getIvParameter()
如下JNI簡例:
#include <jni.h>
//JNIEXPORT jstring JNICALL
jstring Java_cn_tsou_lib_1security_aes_AEScbc_getKey(JNIEnv
*env, jobject instance) {
return (*env)->NewStringUTF(env, "huangxiaoguo1234");
}
jstring Java_cn_tsou_lib_1security_aes_AEScbc_getIvParameter(JNIEnv
*env, jobject instance) {
return (*env)->NewStringUTF(env, "1234huangxiaoguo");
}
檢查你設定的key和IvParameter是否生效的Log日誌篩選tag條件為:huangxiaoguo
AES加密
AESUtils.getInstance().encrypt(String plaintext);
AES解密
AESUtils.getInstance().decrypt(String ciphertext_base64);
RSA加密解密
建立一個公共和私人金鑰,並將其儲存使用Android金鑰儲存庫中,因此,只有
這個應用程式將能夠訪問鍵。
使用之前請先初始化RSAinit
最好放在啟動頁初始化需要一些時間
private RSAPublicKey publicKey = RSAinit.initRSA(this, null, null, 0, null);
initRSA引數介紹
initRSA(Context context,String pcksPadding,String split,int keySize,String alias);
context:上下文
pcksPadding: 加密填充方式 傳null,預設:"RSA/ECB/PKCS1Padding"
split: 當要加密的內容超過bufferSize,則採用partSplit進行分塊加密,
傳null,預設:"#HUANGXIAOGUO#"
keySize: 祕鑰預設長度,傳0,預設:2048
alias: 自己給你的別名,方便在keystore中查詢祕鑰,傳null,預設:"xiaoGuoKey"
獲取客戶端公鑰的base64編碼的String,登入時將公鑰傳遞給後臺
String localPublicKey = EncodeUtils.base64Encode2String(publicKey.getEncoded());
用公鑰對字串進行加密(一般使用公鑰進行加密)
AndroidKeyStoreRSAUtils.encryptByPublicKey(byte[] data, byte[] publicKey);
簡例:
byte[] encryptBytes = AndroidKeyStoreRSAUtils.encryptByPublicKey(encryptionRSAString.getBytes(),
publicKey.getEncoded());
String encryStr = Base64Encoder.encode(encryptBytes);
私鑰加密
AndroidKeyStoreRSAUtils.encryptByPrivateKey(byte[] data, byte[] privateKey);
公鑰解密
AndroidKeyStoreRSAUtils.decryptByPublicKey(byte[] data, byte[] publicKey);
使用私鑰進行解密(一般使用私鑰進行解密)
AndroidKeyStoreRSAUtils.decryptByPrivateKey(byte[] encrypted);
簡例:
byte[] decryptBytes = AndroidKeyStoreRSAUtils.decryptByPrivateKey(Base64Decoder.decodeToBytes(decodeRSAString));
mTvRsaDecode.setText(new String(decryptBytes));
用公鑰對字串進行分段加密
AndroidKeyStoreRSAUtils.encryptByPublicKeyForSpilt(byte[] data, byte[] publicKey);
私鑰分段加密
AndroidKeyStoreRSAUtils.encryptByPrivateKeyForSpilt(byte[] data, byte[] privateKey);
公鑰分段解密
AndroidKeyStoreRSAUtils.decryptByPublicKeyForSpilt(byte[] encrypted, byte[] publicKey);
使用私鑰分段解密
AndroidKeyStoreRSAUtils.decryptByPrivateKeyForSpilt(byte[] encrypted);
通過字串生成私鑰,轉換伺服器傳遞過來的私鑰
AndroidKeyStoreRSAUtils.getPrivateKey(String privateKeyData);
通過字串生成公鑰,轉換伺服器傳遞過來的公鑰
AndroidKeyStoreRSAUtils.getPublicKey(String publicKeyData);
判斷是否建立過祕鑰
AndroidKeyStoreRSAUtils.isHaveKeyStore();
獲得本地AndroidKeyStore中的公鑰
AndroidKeyStoreRSAUtils.getLocalPublicKey();
RSA簽名驗證
使用之前請先初始化RSAinit
###### 簽名
AndroidKeyStoreRSAUtils.signData(String inputStr);
###### 校驗簽名的字串
boolean b = AndroidKeyStoreRSAUtils. verifyData(String input, String signatureStr);
if (b) {
mTvRsaVerify.setText("簽名一致");
} else {
mTvRsaVerify.setText("簽名不一致");
}
SP加密儲存(使用的是RSA)
使用之前請先初始化RSAinit
SP存入
SPSecuredUtils.put(Context context, String key, Object object, RSAPublicKey publicKey);
簡例:
SPSecuredUtils.put(this, "huangxiaoguo", encryptionSpString, publicKey);
SPSecuredUtils.put(this, "huangxiaoguo1", 1, publicKey);
SPSecuredUtils.put(this, "huangxiaoguo2", 0.01, publicKey);
SPSecuredUtils.put(this, "huangxiaoguo3", true, publicKey);
SP讀取
SPSecuredUtils.get(Context context, String key, Object defaultObject);
String huangxiaoguo = (String) SPSecuredUtils.get(this, "huangxiaoguo", "");
int huangxiaoguo1 = (int) SPSecuredUtils.get(this, "huangxiaoguo1", 0);
double huangxiaoguo2 = (double) SPSecuredUtils.get(this, "huangxiaoguo2", 0.0);
boolean huangxiaoguo3 = (boolean) SPSecuredUtils.get(this, "huangxiaoguo3", false);
將物件儲存到sharepreference
SPSecuredUtils.saveDeviceData(Context context, String key, T device, RSAPublicKey publicKey);
將物件從shareprerence中取出來
SPSecuredUtils.getDeviceData(Context context, String key)
移除某個key值已經對應的值
SPSecuredUtils.remove(Context context, String key);
清除所有資料
SPSecuredUtils.clear(Context context);
查詢某個key是否已經存在
SPSecuredUtils.contains(Context context, String key);
返回所有的鍵值對
SPSecuredUtils.getAll(Context context);