Android之KeyStore

席安康
2023-12-01

初始化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 签名一致 
 类似资料: