Android中签名的生成和使用

生成签名

使用 keytool 工具生成密钥库。密钥库是一个包含密钥对的安全文件,其中包括您的应用签名密钥。

签名的加密方式

  • 之前大都使用的RSA
  • 现在已经不推荐使用了,推荐使用SHA256withRSA

签名格式

  • JKS(Java KeyStore):JKS 是 Java 专用格式。
  • PKCS12:PKCS12 是国际标准格式,被大多数操作系统和开发工具支持。Android Studio推荐使用 PKCS12。

注意

更换签名格式是不会影响已发布应用的。

更换加密方式会影响已发布应用,导致无法更新。

JKS(RSA)

1
keytool -genkey -alias xinghuo -keyalg RSA -validity 18250 -keystore xinghuo.keystore

其中

  • -alias android.keystore 别名为alias android.keystore
  • -keyalg RSA 加密类型RSA
  • -validity 20000 有效期天数20000
  • -keystore android.keystore 生成文件路径和名字android.keystore

这将生成一个名为 xinghuo.keystore 的密钥库文件,并使用 RSA 算法生成一个密钥对。

注意

keytool在JDK的bin下面,找不到记得添加环境变量。

现在会报警告

使用的 MD5withRSA 签名算法被视为存在安全风险而且被禁用。

PKCS12(SHA256withRSA)(推荐)

1
keytool -genkeypair -alias xinghuo -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 18250 -storetype PKCS12 -keystore xinghuo2.p12

参数说明:

  • -sigalg SHA256withRSA:指定使用 SHA256withRSA 签名算法
  • -keyalg RSA:密钥算法
  • -keysize 2048:密钥长度(推荐 2048 或更高)
  • -validity 18250:有效期约 50 年

JKS迁移至PKCS12

PKCS12(Public-Key Cryptography Standards #12)是目前行业广泛采用的密钥存储标准格式,相比传统的 JKS(Java KeyStore)格式具有更好的跨平台兼容性(支持 Java、iOS、Windows 等多平台)和安全性。

Android 开发中,推荐将签名证书迁移到 PKCS12 格式(文件后缀通常为 .p12.pfx)。

迁移到行业标准格式 PKCS12

1
keytool -importkeystore -srckeystore xinghuo.keystore -destkeystore xinghuo.p12 -deststoretype pkcs12

查看转换结果

1
keytool -list -v -keystore xinghuo.p12

可以看到

密钥库类型: PKCS12

PKCS12 和 JKS 只是密钥存储格式的不同,转换过程中:

  • 私钥、公钥、证书链等核心签名信息保持不变;
  • 应用签名时使用的签名算法(如 SHA256withRSA) 也不会改变;
  • 转换后的证书本质上与原证书是 “同一身份”,Android 系统和应用商店会识别为同一开发者签名。

因此,用转换后的 PKCS12 证书签名的新版本应用,与原 JKS 证书签名的旧版本应用签名一致,用户可以正常覆盖更新,不会出现 “签名不匹配” 的安装失败问题。

获取签名信息

查看签名类型、有效期、SHA1值

JKS格式

1
keytool -list -v -keystore xinghuo.keystore -storepass xhkjedu

PKCS12格式

1
keytool -list -v -keystore xinghuo2.p12 -storepass xhkjedu

项目中使用

JKS

假如我i们的签名文件是xinghuo.keystore

把它放到app目录下的src同级目录中

build.gradle.kts中添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
android {
signingConfigs {
create("keystore") {
storeFile = file("xinghuo.keystore")
storePassword = "xhkjedu"
keyAlias = "xinghuo"
keyPassword = "xhkjedu"
}
}

buildTypes {
val signConfig=signingConfigs.getByName("keystore")
getByName("release") {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig=signConfig
}
getByName("debug") {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig=signConfig
}
}
}

PKCS12

假如我i们的签名文件是xinghuo.p12

把它放到app目录下的src同级目录中

build.gradle.kts中添加配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
android {
signingConfigs {
create("keystore") {
storeFile = file("xinghuo2.p12")
storeType = "PKCS12"
storePassword = "xhkjedu"
keyAlias = "xinghuo"
keyPassword = "xhkjedu"
}
}

buildTypes {
val signConfig=signingConfigs.getByName("keystore")
getByName("release") {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig=signConfig
}
getByName("debug") {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig=signConfig
}
}
}

打包

image-20240412191657720