Android中的签名机制_第1页
Android中的签名机制_第2页
Android中的签名机制_第3页
Android中的签名机制_第4页
Android中的签名机制_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android中的签名机制 /C=CN/ST=ShanDao/L=QingDao/O=Haier/OU=Haier/CN=Haier/emailAddress=Haier转载时请注明出处和作者联系方式文章出处:作者联系方式:李先静 昨天看了一下Android中的签名机制,这里介绍一下Android中签名用的Key的产生方法和签名的原理。产生Keyo 产生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=如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。如:openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000You are about to be asked to enter information that will be incorporatedinto 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 blankFor some fields there will be a default value,If you enter ., the field will be left blank.Country Name (2 letter code) GB:CNState or Province Name (full name) Berkshire:GuangDongLocality Name (eg, city) Newbury:ShenZhenOrganization Name (eg, company) My Company Ltd:TopwiseOrganizational Unit Name (eg, section) :BronchoCommon Name (eg, your name or your servers hostname) :Email Address :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 = ; thenecho Create a test certificate key.echo Usage: $0 NAMEecho Will generate NAME.pk8 and NAME.x509.pemecho /C=US/ST=California/L=Mountain View/O=Android/OU=Android/CN=Android/emailAddress=returnfiopenssl genrsa -3 -out $1.pem 2048openssl 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=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(Jar) &&!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.MFje = new JarEntry(Jar);je.setTime(timestamp);outputJar.putNextEntry(je);manifest.write(outputJar);o 对manifest签名并写入CERT.SF/ CERT.SFSignature signature = Signature.getInstance(SHA1withRSA);signature.initSign(privateKey);je = new JarEntry(CERT_SF_NAME);je.setTime(timestamp);outputJar.putNextEntry(je);writeSignature,new SignatureOutputStream(outputJar, signature);o 把对输出文件的签名和公钥写入CERT.RSA。/ CERT.RSAje = new JarEntry(CERT_RSA_NAME);je.setTime(timestamp);outputJar.putNextEntry(je);writeSignatureBlock(signature, publicKey, outputJar);签名的作用签名的主要目的为了检测文件是否被别人修改了。但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。分享到: 上一篇:系统程序员成长计划-并发(四)(下) 下一篇:系统程序员成长计划-并发(五)android apk签名(为什么 如何做 验证)android apk签名(为什么 如何做 验证)这篇文章其实就是根据自己的疑问然后结合多个文章结合成的文章引用:一、为什么要签名: 1、发送者的身份认证,由于开发商可能通过使用相同的Package Name来混淆替换已经安装的程序,以此保证签名不同的包不被替换2、保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中内容不被替换,防止交易中的抵赖发生,Market对软件的要求二、签名的说明:1、所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序2、Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证3、如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布4、 数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能5、签名后需使用zipalign优化程序6、Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序三、签名的方法:1、 用eclipse插件方式签名2、 调试签名eclipse插件默认赋予程序一个DEBUG权限的签名,此签名的程序不能发布到market上,此签名有效期为一年,如果过期则导致你无法生成apk文件,此时你只要删除debug keystore即可,系统又会为你生成有效期为一年的新签名b) 开发者生成密钥并签名右键点击项目名,在菜单中选择Android Tools,然后选择Export Signed ApplicationPackage,即可通过eclipse自定义证书并签名c) 开发者导出未签名的包右键点击项目名,在菜单中选择Android Tools,然后选择Export Signed ApplicationPackage,即可导出未签名的包,之后可通过命令行方式签名3、用命令行方式签名使用标准的java工具keytool和jarsigner来生成证书和给程序签名a) 生成签名$ keytool -genkey -keystorekey RSA -validity 10000 -aliasyan注:validity为天数,keyfile为生成key存放的文件,yan为私钥,RSA为指定的加密算法(可用RSA或DSA)b) 为apk文件签名$ jarsigner -verbose -keystorekey signed.apk base.apkyan注:keyfile为生成key存放的文件,signed.apk为签名后的apk,base.apk 为未签名的apk,yan为私钥c) 看某个apk是否经过了签名$ jarsigner verify my_application.apk例如:jarsigner -verify -verbose -certs abc.apk每个签名的apk都会看到如下信息sm 152412 Wed Oct 14 14:16:52 CEST 2009 classes.dexX.509, CN=Meebo, OU=Meebo, O=Meebo, L=Mountain View, ST=California, C=UScertificate is valid from 28/10/08 06:49 to 13/08/82 07:49否则就是没有签名d) 优化(签名后需要做对齐优化处理)zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk 4、在源码中编译的签名a) 使用源码中的默认签名在源码中编译一般都使用默认签名的,在某源码目录中用运行$ mmshowcommands能看到签名命令Android提供了签名的程序signapk.jar,用法如下:$ signapk publickey.x509.pemprivatekey.pk8 input.jar output.jar*.x509.pem为x509格式公钥,pk8为私钥build/target/product/security目录中有四组默认签名可选:testkey,platform, shared, media(具体见README.txt),应用程序中Android.mk中有一个LOCAL_CERTIFICATE字段,由它指定用哪个key签名,未指定的默认用testkey.b) 在源码中自签名Android提供了一个脚本mkkey.sh(build/target/product/security/mkkey.sh),用于生成密钥,生成后在应用程序中通过Android.mk中的LOCAL_CERTIFICATE字段指名用哪个签名c) mkkey.sh介绍i. 生成公钥openssl genrsa -3 -outtestkey.pem 2048其中-3是算法的参数,2048是密钥长度,testkey.pem 是输出的文件ii. 转成x509格式(含作者有效期等)openssl req -new -x509 -keytestkey.pem -out testkey.x509.pem -days 10000 -subj/C=US/ST=California/L=Mountain email=View/O=Android/OU=Android/CN=Android/emailAddress=View/O=Android/OU=Android/CN=Android/emailAddress=/emailiii. 生成私钥openssl pkcs8 -in testkey.pem-topk8 -outform DER -out testkey.pk8-nocrypt把的格式转换成PKCS #8,这里指定了-nocryp,表示不加密,所以签名时不用输入密码四、签名的相关文件1) apk包中签名相关的文件在META_INF目录下CERT.SF:生成每个文件相对的密钥MANIFEST.MF:数字签名信息xxx.SF:这是JAR 文件的签名文件,占位符 xxx标识了签名者xxx.DSA:对输出文件的签名和公钥2)相关源码五、签名的相关问题一般在安装时提示出错:INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES1) 两个应用,名字相同,签名不同2) 升级时前一版本签名,后一版本没签名3) 升级时前一版本为DEBUG签名,后一个为自定义签名4) 升级时前一版本为Android源码中的签名,后一个为DEBUG签名或自定义签名5) 安装未签名的程序6) 安装升级已过有效期的程序6. 相关工具1) 查看某个x509证书的的有效日期签名具体步骤:Apk签名首先要有一个keystore的签名用的文件.keystore是由jdk自带的工具keytool生成的.具体生成方式参考一下:开始-运行-cmd-cd 到你安装的jdk的目录这里我是 C:Program FilesJavajdk1.6.0_10bin然后输入:keytool -genkey -alias asaiAndroid.keystore -keyalg RSA -validity 20000 -keystore asaiAndroid.keystore-alias 后跟的是别名这里是 asaiAndroid.keystore-keyalg 是加密方式这里是 RSA-validity 是有效期 这里是 20000-keystore 就是要生成的keystore的名称 这里是 asaiAndroid.keystore然后按回车按回车后首先会提示你输入密码:这个在签名时要用的要记住了哦。然后会再确认你的密码。之后会依次叫你输入 姓名,组织单位,组织名称,城市区域,省份名称,国家代码等。参考:运行完可以在 C:Program FilesJavajdk1.6.0_10bin 里找到刚才生产的keyStore文件好现在开始给Apk签名了:在 C:Program FilesJavajdk1.6.0_10bin 还提供一个工具 jarsigner.exe好现在可以在刚才的命令行后继续运行以下命令给APK签名:jarsigner -verbose -keystore asaiAndroid.keystore -signedjar LotteryOnline_signed.apk LotteryOnline.apk as

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论