📜  用于签署应用程序的 Android 参考密钥库 (1)

📅  最后修改于: 2023-12-03 15:27:12.091000             🧑  作者: Mango

用于签署应用程序的 Android 参考密钥库

在 Android 应用程序上线之前,你需要对应用程序进行数字签名以保证应用程序的完整性和可信性。Android 提供了一个名为“Android Keystore”的组件来管理密钥,它允许应用程序生成和存储 RSA、ECDSA 和DSA 密钥对,并将密钥存储在一个加密的文件中,任何尝试读取该文件的非授权应用程序都将得到禁止。参考密钥库是其中一种生成数字签名所需的密钥库。

参考密钥库是什么?

参考密钥库(Reference Keystore)是 Android 系统预装的密钥库之一,用于签署应用程序和进行调试。它位于 Android SDK 的“tools”目录下,通常位于以下路径中:

$ANDROID_HOME/tools/lib/security/debug.keystore

它的密码为“android”,别名为“androiddebugkey”。

参考密钥库是保存在 Android SDK 中,并由调试模式使用的默认密钥库。通常,此密钥库只用于在开发期间测试应用程序。当你准备发布应用程序时,你应该使用另一个密钥库生成真实签名的密钥。

为什么要使用参考密钥库?

在进行开发和测试时,使用参考密钥库可以轻松快捷地为你的 Android 应用程序签名。它不需要你自己生成密钥库或密钥,因为它已经在 Android SDK 中提供了。另外,使用参考密钥库可以帮助你检查签名是否正确,因为 Android 系统会比对应用程序的签名和参考密钥库中的签名是否匹配,在调试应用程序时, 您可以使用应用程序的签名Android Keystore完成如下操作:

  1. 生成密钥对:使用 KeyPairGenerator 生成一个新的非对称密钥,其中包括公钥和私钥。同时,指定算法类型和密钥大小。
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
    KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore");
keyPairGenerator.initialize(
    new KeyGenParameterSpec.Builder(
        "alias",
        KeyProperties.PURPOSE_SIGN)
            .setDigests(KeyProperties.DIGEST_SHA256,
                        KeyProperties.DIGEST_SHA512)
            .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
            .setKeySize(2048)
            .build());
KeyPair keyPair = keyPairGenerator.generateKeyPair();

以上代码使用 Android Keystore 生成了一个 RSA 算法的密钥对,命名为“alias”。

  1. 获取密钥:使用密钥库“AndroidKeyStore”和别名来获取前面生成的密钥。
KeyStore keyStore = KeyStore.getInstance("AndroidKeyStore");
keyStore.load(null);

PrivateKey privateKey = (PrivateKey) keyStore.getKey("alias", null);

以上代码使用 Android Keystore 获取了密钥对中的私钥。

  1. 对应用程序进行签名:将应用程序的数据使用私钥进行签名,生成数字签名。可以使用 JCA(Java Cryptography Architecture)或 Bouncy Castle 来完成这个操作。
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(dataToSign);
byte[] digitalSignature = signature.sign();

以上代码对应用程序数据(即要签名的数据)进行签名,如果签名成功,则在变量“digitalSignature”中存储了数字签名。

  1. 验证应用程序签名:将应用程序数据、签名和公钥传递给 Android 系统来检查签名是否正确。
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(dataToSign);

if (signature.verify(digitalSignature)) {
    // signature is valid
} else {
    // signature is invalid
}

以上代码验证应用程序的签名是否正确。如果签名正确,则在 Android 系统中存储的公钥和签名匹配。

总结

使用 Android Keystore 中的参考密钥库可以轻松快捷地为你的应用程序生成数字签名,并进行开发。但是当你准备发布应用程序时,不要忘记使用自己的密钥库生成真实签名的密钥。通过对数字签名的正确使用,你可以保证你的应用程序的完整性和安全性,增强用户的信任感。