Android: AndroidKeyStore 对数据进行签名和验证(1),精通android网络开发pdf

private static String mAlias = null;

public static void setAlias(String alias) {

mAlias = alias;

}

/**

  • 创建一个公共和私人密钥,并将其存储使用Android密钥存储库中,因此,只有

  • 这个应用程序将能够访问键。

  • @param context

  • @throws InvalidAlgorithmParameterException

  • @throws NoSuchProviderException

  • @throws NoSuchAlgorithmException

*/

@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN_MR2)

public static void createKeys(Context context) throws InvalidAlgorithmParameterException,

NoSuchProviderException, NoSuchAlgorithmException {

setAlias(SAMPLE_ALIAS);

//创建一个开始和结束时间,有效范围内的密钥对才会生成。

Calendar start = new GregorianCalendar();

Calendar end = new GregorianCalendar();

end.add(Calendar.YEAR, 1);//往后加一年

AlgorithmParameterSpec spec;

if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {

//使用别名来检索的key 。这是一个key 的key !

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 方式来创建,

// 允许你自定义允许的的关键属性和限制

// String AES_MODE_CBC = KeyProperties.KEY_ALGORITHM_AES + “/” +

// KeyProperties.BLOCK_MODE_CBC + “/” +

// KeyProperties.ENCRYPTION_PADDING_PKCS7;

spec = new KeyGenParameterSpec.Builder(mAlias, KeyProperties.PURPOSE_SIGN)

.setCertificateSubject(new X500Principal(“CN=” + mAlias))

.setDigests(KeyProperties.DIGEST_SHA256)

.setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)

.setBlockModes(KeyProperties.BLOCK_MODE_GCM, KeyProperties.BLOCK_MODE_CTR,

KeyProperties.BLOCK_MODE_CBC, KeyProperties.BLOCK_MODE_ECB)

// .setBlockModes(KeyProperties.BLOCK_MODE_GCM/CTR/CBC/ECB)

.setCertificateSerialNumber(BigInteger.valueOf(1337))

.setCertificateNotBefore(start.getTime())

.setCertificateNotAfter(end.getTime())

.build();

}

KeyPairGenerator kpGenerator = KeyPairGenerator

.getInstance(SecurityConstants.TYPE_RSA,

SecurityConstants.KEYSTORE_PROVIDER_ANDROID_KEYSTORE);<

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 系统中,你可以使用 Java 的加密库来对二维码数据进行签名认证。下面是一个简单的示例代码,展示了如何使用 RSA 算法对二维码数据进行签名验证。 首先,你需要生成一对公私钥。你可以使用以下代码生成 RSA 密钥对: ```java KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(2048); //选择密钥长度,一般推荐 2048 KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); ``` 接下来,你可以使用私钥对二维码数据进行签名: ```java Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(privateKey); signature.update(qrCodeData.getBytes()); byte[] signatureBytes = signature.sign(); ``` 在这个示例中,我们使用 SHA256withRSA 算法进行签名。你可以根据需要选择其他算法。 然后,你可以使用公钥来验证签名的有效性: ```java Signature signature = Signature.getInstance("SHA256withRSA"); signature.initVerify(publicKey); signature.update(qrCodeData.getBytes()); boolean isVerified = signature.verify(signatureBytes); if (isVerified) { // 验证成功 } else { // 验证失败 } ``` 在这个示例中,我们首先初始化一个 Signature 对象,并指定验证使用的公钥。然后,我们使用与签名时相同的数据更新 Signature 对象,并通过调用 verify() 方法来验证签名的有效性。 请注意,这只是一个简单的示例,你可能需要根据你的具体需求进行适当的修改和调整。另外,确保在生产环境中使用安全的密钥长度和算法,并采取适当的保护措施来防止私钥泄露。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值