初始化KeyPair generator
KeyPairGenerator kpGenerator =
KeyPairGenerator.getInstance("RSA/DSA/BKS/AES",
"AndroidKeyStore");
第一个参数是代表加密的方式
第二个参数是代表
创建KeyPairGeneratorSpec
String mAlias = "自己给你的别名" 用于检索或者是恢复你的key,It's a key for the key!
Calendar start = new GregorianCalendar();
Calendar end = new GregorianCalendar();
end.add(Calendar.YEAR, 1);
AlgorithmParameterSpec spec;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// Android 6.0 一下使用这种方式进行生成
spec = new KeyPairGeneratorSpec.Builder(context)
//使用别名来检索的关键。这是一个关键的关键!
.setAlias(mAlias)
// 用于生成自签名证书的主题 X500Principal 接受 RFC 1779/2253的专有名词
.setSubject(new X500Principal("CN=" + mAlias))
//用于自签名证书的序列号生成的一对。
.setSerialNumber(BigInteger.valueOf(1337))
// 签名在有效日期范围内
.setStartDate(start.getTime())
.setEndDate(end.getTime())
.build();
} else {
//Android 6.0(或者以上)使用KeyGenparameterSpec.Builder 方式来创建,允许你自定义允许的的关键属性和限制
spec = new KeyGenParameterSpec.Builder(mAlias, KeyProperties.PURPOSE_SIGN)
.setCertificateSubject(new X500Principal("CN=" + mAlias))
.setDigests(KeyProperties.DIGEST_SHA256)
.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
.setBlockMode(KeyProperties.BLOCK_MODE_GCM/CTR/CBC/ECB)
.setCertificateSerialNumber(BigInteger.valueOf(1337))
.setCertificateNotBefore(start.getTime())
.setCertificateNotAfter(end.getTime())
.build();
}
kpGenerator.initialize(spec);
KeyPair kp = kpGenerator.generateKeyPair();
则加密的结果是
公共密钥: kp.getPublic().toString()
私钥:kp.getPrivate.toString()
生成字符串编码的数据签名,使用密钥对数据进行签名并存储在Android密钥存储库使用密钥对信号数据存储在Android密钥存储库中,此签名可用于和数据后验证签署了这个应用程序
byte[] data = inputStr.getBytes();
KeyStore ks = KeyStore.getInstance(“AndroidKeyStore”);
ks.load(null);
// 从Android加载密钥对密钥存储库中
KeyStore.Entry entry = ks.getEntry(mAlias, null);
//进行判断处理钥匙是不是存储的当前别名下 不存在要遍历别名列表 Keystore.aliases()
if (entry == null) {
Log.w(TAG, "No key found under alias: " + mAlias);
Log.w(TAG, "Exiting signData()...");
return null;
}
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w(TAG, "Not an instance of a PrivateKeyEntry");
Log.w(TAG, "Exiting signData()...");
return null;
}
// 开始签名
Signature s = Signature.getInstance("SHA256withRSA/SHA512withRSA");
//初始化使用指定的私钥签名
s.initSign(((KeyStore.PrivateKeyEntry)entry).
getPrivateKey());
// 签名并存储结果作为Base64编码的字符串。
s.update(data);
byte[] signature = s.sign();
String result =Base64.encodeToString(signature,
Base64.DEFAULT);
校验签名的字符串
//要验证的数据
byte[] data = input.getBytes();
//签名
byte[] signature;
//判断签名十分存在
if (signatureStr == null) {
Log.w(TAG, "Invalid signature.");
Log.w(TAG, "Exiting verifyData()...");
return false;
}
try {
//Base64解码字符串
signature = Base64.decode(signatureStr, Base64.DEFAULT);
} catch (IllegalArgumentException e) {
return false;
}
KeyStore ks = KeyStore.getInstance("AndroidKeyStore");
ks.load(null);
//从Android加载密钥对密钥存储库中
KeyStore.Entry entry = ks.getEntry(mAlias, null);
if (entry == null) {
Log.w(TAG, "No key found under alias: " + mAlias);
Log.w(TAG, "Exiting verifyData()...");
return false;
}
if (!(entry instanceof KeyStore.PrivateKeyEntry)) {
Log.w(TAG, "Not an instance of a PrivateKeyEntry");
return false;
}
Signature s = Signature.getInstance("SHA256withRSA/SHA512withRSA");
// 开始校验签名
s.initVerify(((KeyStore.PrivateKeyEntry) entry).
getCertificate());
s.update(data);
s.verify(signature)
// true 签名一致