android hxgsecurity 常用的集中加密方式封装,android 项目开发案例
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.getLocalPublicK
ey();
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 是否已经存在
评论