分享

Android中的签名方式2

 lifei_szdz 2013-01-16
方式2
在研究android的update签名的过程中,如果对update的文件进行了修改,必须在打包成update.zip之后,进行签名,签名是如何的呢,通过查看一个auto-sign的签名工具的源码发现,签名的指令是这样的:

java -jar signapk.jar testkey.x509.pem testkey.pk8 update.zip update-sign.zip
第一部分:指令部分。
通过查阅资料得之:
它的用法如下:
Usage: signapk publickey.x509[.pem] privatekey.pk8 input.jar output.jar

signapk.jar 是android为jar/zip/apk文件签名的程序

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

那么签名到底是怎样一个过程呢?
1.先为输入的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);
对manifest签名并写入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));
把对输出文件的签名和公钥写入CERT.RSA。
            je = new JarEntry(CERT_RSA_NAME);
            je.setTime(timestamp);
            outputJar.putNextEntry(je);
            writeSignatureBlock(signature, publicKey, outputJar);
签名的作用是什么呢?
签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。

第二部分:公钥、密钥生成部分。
在这个语句中,需要两个文件一个是testkey.x509.pem 一个是testkey.pk8这俩个文件是什么呢?
第一步:如何产生Key

首先要产生RSA私钥(private key),如何产生呢,需要一个openssl的工具,该工具在命令提示符下使用。
先介绍openssl的用法,关于openssl是什么参阅:openssl

格式:openssl genrsa [-out filename] [-passout arg] [-des] [-des3] [-idea] [-f4] [-3] [-rand file(s)] [numbits] 
-out filename       (私有密钥输入文件名,缺省为标准输出。)
-passout arg
-des|-des3|-idea    (采用什么加密算法来加密我们的密钥。一般会要你输入保护密码。 如果这三个中一个也没                                   set, 我们的密钥将不被加密而输入。)
-F4|-3                   使用的公共组件,一种是3, 一种是F4, 我也没弄懂这个option是什么意思。 
-rand file(s)            产生key的时候用过seed的文件,可以把多个文件用冒号分开一起做seed. 
numbits
          指明产生的参数的长度。必须是本指令的最后一个参数。如果没有指明,则产生512bit长的参数。

第一步:生成testkey.pem
openssl genrsa -3 -out testkey.pem 2048 
(-3 是算法的参数-out 输出到testke.pem这个文件2048 是私钥长度。)

第二步:生成testkey.x509.pem
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000 \
-subj ‘/C=US/ST=California/L=Mountain 

产生PKCS#10格式的认证请求。所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人邮件地址)。
如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。


第三布:生成testkey.pk8
openssl pkcs8 -in testkey.pem -topk8 -outform DER -out testkey.pk8 -nocrypt

把私钥的格式转换成PKCS #8(Private-Key Information Syntax Standard.)
私钥是不能让别人知道的,否则就起不到保密的作用了。私钥通常是要加密保存的,但这里指定了-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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多