`
king_tt
  • 浏览: 2290418 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android中的签名机制

阅读更多

昨天看了一下Android中的签名机制,这里介绍一下Android中签名用的Key的产生方法和签名的原理。

产生Key

o 产生RSA私钥(private key)
openssl genrsa -3 -out testkey.pem 2048

-3 是算法的参数(public exponent)。
2048 是私钥长度。
testkey.pem 是输出的文件。

o 产生PKCS#10格式的认证请求。所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)。
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 /
-subj ‘/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com’

如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。如:

openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [GB]:CN
State or Province Name (full name) [Berkshire]:GuangDong
Locality Name (eg, city) [Newbury]:ShenZhen
Organization Name (eg, company) [My Company Ltd]:Topwise
Organizational Unit Name (eg, section) []:Broncho
Common Name (eg, your name or your server’s hostname) []:broncho.cn
Email Address []:bronchosales@gmail.com

o 把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)

openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt

私钥是不能让别人知道的,否则就起不到保密的作用了。私钥通常是要加密保存的,但这里指定了-nocryp,表示不加密。

Android提供了一个脚本mkkey.sh用来简化上面的步骤:

if ["$1" == ""]; then
    echo "Create a test certificate key."
    echo "Usage: $0 NAME"
    echo "Will generate NAME.pk8 and NAME.x509.pem"
    echo "  /C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com"
    return
fi
 
openssl genrsa -3 -out $1.pem 2048
 
openssl req -new -x509 -key $1.pem -out $1.x509.pem -days 10000 /
    -subj '/C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=android@android.com'
 
openssl pkcs8 -in $1.pem -topk8 -outform DER -out $1.pk8 -nocrypt

签名

Android提供了为jar/zip文件签名的程序signapk.jar 。

它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。

如:java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-signed.zip

现在我们来看看签名到底做了些什么:

o 先为输入的jar/zip文件中的所有文件生成SHA1数字签名(除了CERT.RSA,CERT.SF和MANIFEST.MF)

        for (JarEntry entry: byName.values()) {
            String name = entry.getName();
            if (!entry.isDirectory() && !name.equals(JarFile.MANIFEST_NAME) &&
                !name.equals(CERT_SF_NAME) && !name.equals(CERT_RSA_NAME) &&
                (stripPattern == null ||
                 !stripPattern.matcher(name).matches())) {
                InputStream data = jar.getInputStream(entry);
                while ((num = data.read(buffer)) > 0) {
                    md.update(buffer, 0, num);
                }
 
                Attributes attr = null;
                if (input != null) attr = input.getAttributes(name);
                attr = attr != null ? new Attributes(attr) : new Attributes();
                attr.putValue("SHA1-Digest", base64.encode(md.digest()));
                output.getEntries().put(name, attr);
            }
        }

并把数字签名信息写入MANIFEST.MF

            je = new JarEntry(JarFile.MANIFEST_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            manifest.write(outputJar);

o 对manifest签名并写入CERT.SF

            // CERT.SF
            Signature signature = Signature.getInstance("SHA1withRSA");
            signature.initSign(privateKey);
            je = new JarEntry(CERT_SF_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            writeSignatureFile(manifest,
                    new SignatureOutputStream(outputJar, signature));

o 把对输出文件的签名和公钥写入CERT.RSA。

            // CERT.RSA
            je = new JarEntry(CERT_RSA_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            writeSignatureBlock(signature, publicKey, outputJar);

签名的作用

签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。

分享到:
评论

相关推荐

    Android签名机制介绍

    一、Android签名机制--基础概念 1. 消息摘要算法 2. 非对称加密算法(RSA算法) 3. 数字签名 二、Android签名机制--APK签名过程 1. APK签名概述 2. APK签名相关的文件 3. 签名的过程(MANIFEST.MF) 4. 签名的过程...

    一种Android数字签名验证机制漏洞探析.pdf

    本文深入探讨了Android系统数字签名验证机制中存在的一类漏洞,以及其成因和可能的解决方案。首先,文章介绍了数字签名和验证过程的基本原理,随后详细分析了Android系统数字签名机制的具体作用及其潜在的漏洞。 在...

    基于Android V2签名机制的应用签名系统的设计与实现.pdf

    Android V2签名机制是Android应用开发中的一个重要环节,特别是在Android 7.0及更高版本中。数字签名在保障应用安全方面起着至关重要的作用,确保应用的来源可信,并且在更新时保持一致性。未签名的应用无法在...

    Delphi XE5 图解为Android应用制作签名

    Delphi XE5 中的签名机制是应用程序在 Android 平台上发布时必不可少的步骤。通过生成新的签名文件或选择已经存在的签名文件,开发者可以确保应用程序的安全和可靠性,从而提高应用程序的质量和可靠性。 Delphi XE...

    mac android app 签名工具

    在Android应用开发中,签名是必不可少的一环,它关乎到应用的安全性和可分发性。在Mac环境下,针对Android APK的签名工具有多种选择,...在进行Android开发时,了解和掌握签名机制以及如何使用这样的工具是至关重要的。

    Android中的签名机制.doc

    以下是关于Android签名机制的详细解释: 1. **生成Key** - 私钥(private key)的生成:使用`openssl`工具,通过`openssl genrsa`命令创建RSA私钥,例如`openssl genrsa -3 -out testkey.pem 2048`,这里的参数`-3`...

    android 系统签名工具

    一、Android签名机制 Android系统的签名机制是为了保证应用的完整性和防止篡改。每个APK文件在打包后都会包含一个数字签名,这个签名验证了应用的代码和资源没有被修改过。当用户尝试安装应用时,Android系统会检查...

    android 重新签名工具

    以下将详细介绍Android签名机制以及如何使用这样的工具。 一、Android签名机制 Android应用在发布前必须经过数字签名,以验证应用的来源并确保其在安装和运行时未被篡改。签名过程涉及到以下几个关键概念: 1. **...

    android10 apk签名文件

    在Android系统中,APK签名是一个至关重要的过程,它确保了应用的完整性和开发者身份的验证。在Android 10中,这个过程没有本质的...开发者需熟知签名机制,合理运用签名工具,遵循最佳实践,以确保应用的质量和安全性。

    Android签名 签名格式转换 工具

    总的来说,Android签名是保障应用安全的重要手段,理解并熟练掌握签名机制和相关工具的使用对于Android开发者至关重要。无论是手动操作还是借助工具,都需要确保签名过程的正确执行,以确保应用能够顺利发布并提供...

    Android的权限机制之—— “沙箱”机制sharedUserId和签名

    总结来说,Android的“沙箱”机制、`sharedUserId`和签名机制共同构成了一个相对安全的应用环境。理解并正确运用这些机制,有助于开发者构建更安全、更可控的Android应用,同时也为用户提供更好的隐私保护。

    Android 系统签名文件

    在Android操作系统中,系统签名文件扮演着至关重要的角色,它确保了应用和系统的安全性和完整性。Android系统签名是为了验证应用程序或系统更新是否来源于可信的源,并且未经篡改。这个过程涉及到一系列的安全机制,...

    android系统签名工具

    本文将详细阐述Android系统的签名机制,包括其重要性、工作原理以及如何使用签名工具。 一、Android系统签名的重要性 1. **验证应用来源**:签名能证明应用的开发者身份,使用户了解应用的来源,增加用户的信任度...

    Android 系统签名.zip

    在Android操作系统中,系统签名是一项至关重要的安全机制,它确保了系统的完整性以及应用程序的权限管理。这个名为"Android 系统签名.zip"的压缩包包含了用于Android系统签名的关键文件,让我们逐一了解它们的作用。...

    android8.1系统签名所需文件

    首先,让我们理解Android系统的签名机制。Android使用数字签名来验证应用程序的身份和完整性,防止恶意代码篡改。系统签名层是用于签名系统应用程序和APKs,确保它们具有足够的权限来访问受保护的系统资源。在...

    Android签名和权限

    ### Android签名和权限详解 #### 一、移动平台中的主流签名作用:自签名的完整性鉴别 在移动平台中,特别是Android系统中,签名扮演着至关重要的角色。它不仅仅是确保应用程序来源的真实性,还涉及到应用程序的...

    Android系统签名工具.rar

    首先,了解Android应用的签名机制至关重要。在Android上,每个应用程序在发布之前都需要经过签名。签名的主要目的是验证应用的开发者身份,确保应用在安装和运行时未被篡改,同时允许应用获取特定的权限。Android...

    Android数字签名

    Android数字签名是Android系统安全机制的关键组成部分,确保了应用程序的来源可识别且代码未被篡改。每一个在Android系统上安装的应用程序都需要通过数字证书进行签名,这与Java平台的安全模型相似。数字证书包含了...

    Android中签名原理

    在Android系统中,签名机制是保障应用程序安全性和完整性的关键环节。它涉及到多个方面的知识,包括数字签名、证书、密钥对以及应用的发布流程。本文将深入解析Android的签名原理,帮助你全面理解这一重要概念。 ...

Global site tag (gtag.js) - Google Analytics