KeyStore秘钥库

article/2025/9/24 14:28:13

keytool

在打包Android APK的时候进行签名需要选择一个keystore,查看秘钥库:

C:\Users\47355\.android>keytool -list -v -keystore debug.keystore
输入密钥库口令:
密钥库类型: PKCS12
密钥库提供方: SUN
您的密钥库包含 1 个条目
别名: androiddebugkey
条目类型: PrivateKeyEntry
证书链长度: 1
证书[1]:
所有者: C=US, O=Android, CN=Android Debug
发布者: C=US, O=Android, CN=Android Debug
序列号: 1
生效时间: Mon Mar 07 12:44:02 CST 2022, 失效时间: Wed Feb 28 12:44:02 CST 2052
证书指纹:
SHA1: 5B:AE:41:23:D7:B4:40:DA:70:F2:D7:C6:25:A0:F1:45:6A:23:A8:9E
SHA256: 77:CE:12:A1:9B:FA:5E:40:DD:C1:B7:1B:C4:58:E1:A0:A7:50:D7:DF:2C:87:A5:82:DD:3F:A7:11:77:BB:52:BE
签名算法名称: SHA1withRSA ()
主体公共密钥算法: 2048 位 RSA 密钥
版本: 1
Warning:
<androiddebugkey> 使用的 SHA1withRSA 签名算法被视为存在安全风险。此算法将在未来的更新中被禁用。

使用Android studio生成秘钥库:
Android studio生成秘钥库
使用Java的keytool生成秘钥库:

keytool -genkey -alias ali1 -keyalg RSA -keysize 1024 -keystore C:\Users\47355\Desktop\kst\bbb.keystore

使用Java代码生成秘钥库

public static void main(String[] args) throws GeneralSecurityException {try {/*** PKCS12,这是一个标准的密钥库类型,可以在Java和其他语言中使用。* 您可以在sun.security.pkcs12.PKCS12KeyStore找到这个密钥库的实现。* 它通常有p12或pfx的扩展。您可以在此类型上存储私钥、密钥和证书。* 与JKS不同,PKCS12密钥库上的私钥可以用Java提取。* 这种类型是可移植的,可以与其他语言编写的其他库一起操作,如C、C++或C语言*/
//            KeyStore ks = KeyStore.getInstance("JKS");
//            KeyStore ks = KeyStore.getInstance(ANDROID_KEY_STORE);
//            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
//            KeyStore ks = KeyStore.getInstance(PKCS12_KEYSTORE_TYPE, BouncyCastleProvider.PROVIDER_NAME);KeyStore ks = KeyStore.getInstance("pkcs12");ks.load(null, null);/*** 签名算法名称: SHA1withRSA、SHA256withRSA*/CertAndKeyGen certAndKeyGen = new CertAndKeyGen("RSA", "SHA1WithRSA", null);/*** keySize除了1024还有2048*/certAndKeyGen.generate(keysize);PrivateKey privateKey = certAndKeyGen.getPrivateKey();PublicKey publicKey = certAndKeyGen.getPublicKey();X509Certificate[] chain = new X509Certificate[1];X500Name x500Name = new X500Name(commonName, organizationalUnit, organization, city, state, country);chain[0] = certAndKeyGen.getSelfCertificate(x500Name, new Date(), (long)validity*24*60*60);// store away the key storeFileOutputStream fos = new FileOutputStream(filePath);/*** 此处只能用privateKey*/
//            ks.setKeyEntry(alias, publicKey, keyPassword, chain);ks.setKeyEntry(alias, privateKey, keyPassword, chain);ks.store(fos, keyPassword);fos.close();System.out.println("create Success");} catch (KeyStoreException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (CertificateException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

Java代码验证签名

static Cipher cipher;static {// 使用默认RSAtry {cipher = Cipher.getInstance("RSA");} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();}}public static void main(String[] args) throws Exception {FileInputStream is = new FileInputStream(new File("C:\\Users\\47355\\Desktop\\kst\\aaa.jks"));KeyStore keyStore = KeyStore.getInstance("JKS");keyStore.load(is, "s7865787".toCharArray());/*** 别名*/Enumeration aliasEnum = keyStore.aliases();String keyAlias = "" ;while (aliasEnum.hasMoreElements()) {keyAlias = (String) aliasEnum.nextElement();System.out.println("别名"+keyAlias);}/*** 证书指纹*/Certificate certificate = keyStore.getCertificate(keyAlias);X509Certificate x509Certificate = (X509Certificate) certificate;digest(x509Certificate.getEncoded(),"SHA-1");/***加载公钥*/PublicKey publicKey = certificate.getPublicKey();/*** 加载私钥,这里填私钥密码*/KeyStore.Entry keyStoreEntry = keyStore.getEntry(keyAlias,new KeyStore.PasswordProtection("s7865787".toCharArray()));KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStoreEntry;PrivateKey privateKey = privateKeyEntry.getPrivateKey();/*** 加载私钥另一写法*///PrivateKey privateKey = (PrivateKey) keyStore.getKey(keyAlias, "123456".toCharArray());/*** base64输出私钥* Base64是一种用64个字符来表示任意二进制数据的方法。它是一种编码方式,而非加密方式。* 它通过将二进制数据转变为64个“可打印字符”,完成了数据在HTTP协议上的传输*/String strKey = Base64.getEncoder().encodeToString(privateKey.getEncoded());System.out.println("Base64输出私钥:"+strKey);/*** 签名 + 验签 + 编码*/
//        String signBase64Encoded = Base64.getEncoder().encodeToString(sign("测试msg".getBytes(),privateKey,"SHA1withRSA",null));
//        boolean verfi = verify("测试msg".getBytes(),Base64.getDecoder().decode(signBase64Encoded), publicKey,"SHA1withRSA",null);
//        System.out.println(verfi);/*** 签名(私钥加密) + 验签*/String message = "我是消息";byte[] signature = sign(message.getBytes(StandardCharsets.UTF_8), privateKey, "SHA1withRSA", null);boolean verify = verify(message.getBytes(StandardCharsets.UTF_8), signature,publicKey, "SHA1withRSA", null);System.out.println("验签结果:"+verify);/*** 摘要*/
//        byte[] privateEncrypted = privateEncrypt(message.getBytes(StandardCharsets.UTF_8), privateKey);byte[] digest = digest(message.getBytes(StandardCharsets.UTF_8), "SHA-1");/*** 私钥加密摘要* 使用Cipher进行私钥加密 r1* 使用RSACore进行私钥加密 r2* signature.sign()     r3* 结论:r1、r2、r3三者不相等*/byte[] privateEncrypted = privateEncryptWithCipherRSA(digest, privateKey);byte[] privateEncrypted2 = RSACore.rsa(digest, (RSAPrivateKey)privateKey, true);/*** 公钥解密*/// publicDecrypted 等于 digest,公钥解密成功byte[] publicDecrypted = publicDecryptWithCipherRSA((RSAPublicKey) publicKey, privateEncrypted);/*** 公钥加密*/byte[] publicEncrypted = publicEncrypt(digest, publicKey);/*** 私钥解密*/final byte[] privateDecrypted = privateDecrypt(privateKey, publicEncrypted);System.out.println("end");}/*** 公钥解密*/public static byte[] publicDecryptWithCipherRSA(RSAPublicKey publicKey, byte[] cipherData)throws Exception {Cipher cipher;try {// 使用默认RSAcipher = Cipher.getInstance("RSA");// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, publicKey);byte[] output = cipher.doFinal(cipherData);return output;} catch (NoSuchAlgorithmException e) {throw new Exception("无此解密算法");} catch (NoSuchPaddingException e) {e.printStackTrace();return null;} catch (InvalidKeyException e) {throw new Exception("解密公钥非法,请检查");} catch (IllegalBlockSizeException e) {throw new Exception("密文长度非法");} catch (BadPaddingException e) {throw new Exception("密文数据已损坏");}}/*** 私钥解密*/public static byte[] privateDecrypt(PrivateKey privateKey, byte[] cipherData)throws Exception {byte[] output = null;try {// cipher= Cipher.getInstance("RSA", new BouncyCastleProvider());cipher.init(Cipher.DECRYPT_MODE, privateKey);output = cipher.doFinal(cipherData);} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {throw new Exception("密文长度非法");} catch (BadPaddingException e) {throw new Exception("密文数据已损坏");}return output;}/*** 私钥加密*/public static byte[] privateEncryptWithCipherRSA(byte[] messageBytes,PrivateKey privateKey) {Cipher cipher;try {// 使用默认RSAcipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, privateKey);byte[] output = cipher.doFinal(messageBytes);return output;} catch (NoSuchAlgorithmException e) {// 无此加密算法e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {// 加密私钥非法,请检查e.printStackTrace();} catch (IllegalBlockSizeException e) {// 明文长度非法e.printStackTrace();} catch (BadPaddingException e) {// 明文数据已损坏e.printStackTrace();}return null;}/*** 公钥加密*/public static byte[] publicEncrypt(byte[] messageBytes,PublicKey publicKey) {try {cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] output = cipher.doFinal(messageBytes);return output;} catch (IllegalBlockSizeException | InvalidKeyException e) {// 明文长度非法e.printStackTrace();} catch (BadPaddingException e) {// 明文数据已损坏e.printStackTrace();}return null;}/*** 计算字节数组指纹*/public static byte[] digest(byte[] der,String algorithm) throws NoSuchAlgorithmException, CertificateEncodingException {/*** 证书指纹*/
//        MessageDigest md = MessageDigest.getInstance("SHA-1");
//        MessageDigest md = MessageDigest.getInstance("md5");
//        MessageDigest md = MessageDigest.getInstance("sha-256");MessageDigest md = MessageDigest.getInstance(algorithm);md.update(der);byte[] digest = md.digest();String digestHex = DatatypeConverter.printHexBinary(digest);final String s = digestHex.toLowerCase();return digest;}/*** 签名*/public static byte[] sign(byte[] message, PrivateKey privateKey, String algorithm, String provider) throws Exception {Signature signature;if (null == provider || provider.length() == 0) {signature = Signature.getInstance(algorithm);} else {signature = Signature.getInstance(algorithm, provider);}signature.initSign(privateKey);signature.update(message);return signature.sign();}/*** 验签*/public static boolean verify(byte[] message, byte[] signMessage, PublicKey publicKey, String algorithm,String provider) throws Exception {Signature signature;if (null == provider || provider.length() == 0) {signature = Signature.getInstance(algorithm);} else {signature = Signature.getInstance(algorithm, provider);}signature.initVerify(publicKey);signature.update(message);return signature.verify(signMessage);}

http://chatgpt.dhexx.cn/article/OodWjKB7.shtml

相关文章

keystore 介绍

随时随地阅读更多技术实战干货&#xff0c;获取项目源码、学习资料&#xff0c;请关注源代码社区公众号(ydmsq666) Keytool 是一个有效的安全钥匙和证书的管理工具. Java 中的 keytool.exe &#xff08;位于 JDK\Bin 目录下&#xff09;可以用来创建数字证书&#xff0c;所有的…

安卓生成keystore和查看keystore

————————————————重要通知—————————————— Hello&#xff0c;本人的博客文章已更新至个人网站&#xff08;www.jonexu.cn&#xff09; 文章中有问题可以到网站联系博主&#xff0c;后续新的文章也将更新在个人网站 —————————————…

Python Tkinter库的简单使用

今天写了两个小小的图像界面小游戏&#xff0c;对Tkinter库进行了简单的熟悉。 1.随机造句小游戏&#xff1a; import Tkinter as tk import random window tk.Tk()def randomNoun():nouns ["cats", "hippos", "cakes"]noun random.choice…

《tkinter实用教程二》tkinter的子模块ttk

更多《Tkinter 实用教程》系列文章 tkinter 的子模块 ttk 本文主要介绍 tkinter 子模块的特性&#xff0c;以及和原生 tkinter 控件之间的区别。 tkinter.ttk 模块提供了对 tk 风格控件集合的访问途径&#xff0c;在 tkinter 8.5 中引入。 引入 tkinter.ttk 的基本思想是尽…

tkinter 使用详解

文章目录 1、窗口设置各控件 显示 一览表&#xff1a;变量有&#xff1a; 2、Label 标签部件3、Button 按钮部件4、Checkbutton 选择部件&#xff08;可以多选&#xff09;5、Radiobutton 选择部件&#xff08;只能单选&#xff09;6、Frame 部件LabelFrame 部件 7、Entry 单行…

Tkinter基础

1.tkinter tkinter是Python下面向tk的图形界面接口库&#xff0c;可以方便地进行图形界面设计和交互操作编程。tkinter的优点是简单易用、与Python的结合度好。tkinter在Python 3.x下默认集成&#xff0c;不需要额外的安装操作&#xff1b;不足之处为缺少合适的可视化界面设计工…

Python Tkinter教程(二)——Label控件、Frame控件、Button控件的完整参数和所有方法及详细用法

>>>【上节回顾&#xff1a;tkinter编程基本步骤、窗口基本属性及Toplevel控件的使用】<<< Python Tkinter教程&#xff08;二&#xff09; 这篇博客将详细并尽可能完整地介绍tkinter模块15种基本控件中的Label控件、Frame控件和Button控件&#xff0c;包括所…

【python】tkinter教程、35个tkinter示例代码和GUI图示

#示例1&#xff1a;主窗口及标题import tkinter as tkapp tk.Tk() #根窗口的实例(root窗口)app.title(Tkinter root window) #根窗口标题theLabel tk.Label(app, text我的第1个窗口程序&#xff01;) #label组件及文字内容theLabel.pack() #pack()用于自动调节组件的尺寸app.…

Tkinter模块学习

Tkinter 主窗口和位置大小 通过geometry(wxhxy)进行设置&#xff0c;w为宽度&#xff0c;h为高度&#xff0c;x表示距离屏幕左边的距离&#xff0c;-x表示距离屏幕右边的距离&#xff0c;y表示距离屏幕上边的距离&#xff0c;-y表示屏幕下边的距离 # -*- coding: UTF-8 -*- D…

Python GUI之tkinter库教程

tkinter的简介 tkinter 是 Python 的标准 GUI 库。它基于 Tk 工具包&#xff0c;该工具包最初是为工具命令语言&#xff08;Tool Command Language&#xff0c;Tcl&#xff09;设计的。Tk 普及后&#xff0c;被移植到很多其他的脚本语言中&#xff0c;包括 Perl&#xff0c;Ru…

Tkinter使用

一、前言 这篇文章是去年8月份学习python时顺便在博客园写的一篇笔记&#xff0c;现在搬运到hexo博客上来&#xff0c;主要针对新手。由于本篇文章较长&#xff0c;所以下面给出内容目录方便跳转阅读&#xff0c;当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅。 首…

Tkinter保姆级教程(上)

目录 什么是GUI Tkinter用法详解 第一个Tkinter程序 常用控件和属性 主窗口 Label标签控件 Button按钮控件 Entry输入控件 基本属性 Text 文本控件 列表框(ListBox)和组合框(Combobox) 单选框(Radiobutton)和多选框按钮(Checkbutton) 什么是GUI 图形用户界面&#xf…

《tkinter实用教程一》Linux环境下安装tkinter

更多《Tkinter 实用教程》系列文章 在 Linux 环境下安装 tkinter tkinter 是 Python 编程语言中描述用于构建图形用户界面 (GUI) 的控件集&#xff0c;因此&#xff0c;学习 tkinter 安装之前&#xff0c;需要首先确定您已经正确安装了 Python。 您可以使用如下命令&#xf…

Tkinter简介

Tkinter简介 (也叫 Tk 接口)是 Tk 图形用户界面工具包标准 的 Python 接口。 Tk 是一个轻量级的跨平台图形用户界面 (GUI)开发工具。Tk 和 Tkinter 可以运行在大多数 的 Unix 平台、Windows、和 Macintosh 系统。 由于是Python自带的标准库&#xff0c;我们想要使用它的时候…

tkinter库详解

①导入标准库&#xff08;tkinter为python标准库无需安装&#xff09; from tkinter import * ②窗口的创建和设置 窗口的创建和设置方法注释rootTk()生成主窗口root.geometry(‘250x250’)改变窗体大小&#xff08;‘宽x高’&#xff09;&#xff0c;注意是x不是*root.geome…

python tkinter详解

PYTHON TKINTER Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI 工具包的接口 .Tk 和 Tkinter 可以在大多数的平台下使用,同样可以应用在 Windows 和 Mac系统里。 与tkinter齐名的还有wxpython&#xff0c;jython&#xff0c;pyqt&#xff08;pyqt5&#xff09;。其中&#x…

python-tkinter 官方文档

python-tkinter官方文档 防盗声明&#xff1a;在其他网站看到的都是盗版的 本文源地址唯一地址 https://blog.csdn.net/weixin_44331765/article/details/120923775 搜了好多都收费&#xff0c;用官网的文档赚钱也是够了&#xff0c;分享一个给大家&#xff0c;互相学习。 1…

python --Tkinter详解

简介 tkinter tkinter(Tk interface)是Python的标准GUl库&#xff0c;支持跨平台的GUl程序开发。tkinter适合小型的GUl程序编写&#xff0c;也特别适合初学者学习GUl编程。 wxPython wxPython是比较流行的GUI库&#xff0c;适合大型应用程序开发&#xff0c;功能强于tkinter,整…

【Python】GUI编程(Tkinter)教程

什么是Tkinter&#xff1f; Tkinter 是 Python 的标准 GUI 库。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。 由于 Tkinter 是内置到 python 的安装包中、只要安装好 Python 之后就能 import Tkinter 库、而且 IDLE 也是用 Tkinter 编写而成、对于简单的图形界面 Tkinte…

Tkinter教程(每天半小时,3天彻底掌握Tkinter)day1

Tkinter教程(每天半小时&#xff0c;3天彻底掌握Tkinter)day1 目录 Tkinter教程(每天半小时&#xff0c;彻底掌握Tkinter)day1 教程环境 Tkinter概述 GUI是什么 Tkinter是什么 Tkinter的弊端 第一个Tkinter程序 插入ico 关闭python窗体 python窗体居中设置 护眼色_颜…