<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 189,comments - 115,trackbacks - 0
    android 簽名機制 apk  zip 包簽名。

    Android中的簽名機制

    http://www.limodev.cn/blog/archives/1271

    文章出處:http://www.limodev.cn/blog

    昨天看了一下Android中的簽名機制,這里介紹一下Android中簽名用的Key的產(chǎn)生方法和簽名的原理。

    產(chǎn)生Key

    o 產(chǎn)生RSA私鑰(private key)
    openssl genrsa -3 -out testkey.pem 2048

    -3 是算法的參數(shù)(public exponent)。
    2048 是私鑰長度。
    testkey.pem 是輸出的文件。

    o 產(chǎn)生PKCS#10格式的認(rèn)證請求。所謂認(rèn)證請求就是發(fā)給認(rèn)證機構(gòu)認(rèn)證的一個請求,它主要包括一個公鑰和一些相關(guān)信息(如組織名稱和聯(lián)系人郵件地址)。
    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’

    如果不提供最后兩個參數(shù),openssl會提示你輸入相關(guān)信息,這里的信息可以根據(jù)你自己的實際情況填寫。如:

    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 把私鑰的格式轉(zhuǎn)換成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

    第一個參數(shù)是公鑰,即前面第二步產(chǎn)生的testkey.x509.pem。
    第二個參數(shù)是私鑰,即前面第三步產(chǎn)生的testkey.pk8。
    第三個參數(shù)是要簽名的文件。
    第四個參數(shù)是輸出的文件(即簽名后的文件)。

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

    現(xiàn)在我們來看看簽名到底做了些什么:

    o 先為輸入的jar/zip文件中的所有文件生成SHA1數(shù)字簽名(除了CERT.RSA,CERT.SF和MANIFEST.MF)

            for (JarEntry entry: byName.values()) {
    String name = entry.getName();
    if (!entry.isDirectory() &amp;&amp; !name.equals(JarFile.MANIFEST_NAME) &amp;&amp;
    !name.equals(CERT_SF_NAME) &amp;&amp; !name.equals(CERT_RSA_NAME) &amp;&amp;
    (stripPattern == null ||
    !stripPattern.matcher(name).matches())) {
    InputStream data = jar.getInputStream(entry);
    while ((num = data.read(buffer)) &gt; 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);
    }
    }

    并把數(shù)字簽名信息寫入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);

    簽名的作用

    簽名的主要目的為了檢測文件是否被別人修改了。但它并不能禁止別人修改,因為你完全重新生成簽名,但是你生成的簽名和原來是不一樣的。



    用signapk.jar簽名android的update.zip文件【原創(chuàng)】


    用signapk.jar簽名android的update.zip文件

        linux系統(tǒng)下執(zhí)行:

        java -jar out/host/linux-x86/framework/signapk.jar -w build/target/product/security/JBS.x509.pem build/target/product/security/JBS.pk8 out/target/product/JBS/update-not-signed.zip out/target/product/JBS/update.zip


    用Android自帶的signapk.jar + .x509.pem + .pk8簽名應(yīng)用程序  

    http://lmdy2001.blog.163.com/blog/static/8423891020114262323816/
    文件位置:可以在platform/build/target/product/security/中找到platform.pk8 platform.x509.pem等簽名文件,對應(yīng)不同的權(quán)限。
    signapk.jar:由/platform/build/tools/signapk/編譯產(chǎn)出,可以在/out/host/linux-x86/framework/中找到。

    簽名:
    java -jar signapk.jar platform.x509.pem platform.pk8 MyDemo.apk MyDemo_signed.apk 得到具有對應(yīng)權(quán)限的APK

    優(yōu)化APK:
    zipalign -v 4 MyDemo_signed.apk MyDemo_new.apk

    查循APK是否優(yōu)化過:
    zipalign -c -v 4 MyDemo.apk





    posted on 2011-08-24 11:14 MEYE 閱讀(5345) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 亚洲一区二区三区高清不卡| 久久久久亚洲精品男人的天堂 | 精品亚洲一区二区三区在线观看 | 99re6热视频精品免费观看| 亚洲自偷自偷在线制服 | 18禁在线无遮挡免费观看网站| 亚洲综合精品香蕉久久网| 免费国产99久久久香蕉| 亚洲网站在线观看| 91在线视频免费播放| 亚洲综合无码无在线观看| 亚洲a级在线观看| 青青青视频免费观看| 亚洲国产综合精品一区在线播放| 久久精品国产亚洲AV无码麻豆| 91久久精品国产免费一区| 亚洲成AⅤ人影院在线观看| 九九99热免费最新版| 日韩毛片免费在线观看| 黄色大片免费网站| 无码一区二区三区免费视频 | 亚洲av无码专区在线电影| 免费一级做a爰片久久毛片潮喷| 亚洲图片中文字幕| 大地资源中文在线观看免费版| 亚洲国产精品无码av| 成人免费一区二区三区| 亚洲综合一区二区国产精品| 毛片免费vip会员在线看| 大片免费观看92在线视频线视频| 日韩一级免费视频| 久青草视频97国内免费影视| 亚洲电影免费观看| 亚洲不卡无码av中文字幕| 久久精品免费观看| 亚洲av永久无码天堂网| 亚洲日产无码中文字幕| 色窝窝免费一区二区三区| 一级**爱片免费视频| 亚洲春色在线观看| 久久久久亚洲av成人无码电影 |