Android中的签名机制.docx
- 文档编号:26433240
- 上传时间:2023-06-19
- 格式:DOCX
- 页数:18
- 大小:1.27MB
Android中的签名机制.docx
《Android中的签名机制.docx》由会员分享,可在线阅读,更多相关《Android中的签名机制.docx(18页珍藏版)》请在冰豆网上搜索。
Android中的签名机制
Android中的签名机制
'/C=CN/ST=ShanDao/L=QingDao/O=Haier/OU=Haier/CN=Haier/emailAddress=Haier'
时请注明出处和作者联系方式
文章出处:
作者联系方式:
先静
昨天看了一下Android中的签名机制,这里介绍一下Android中签名用的Key的产生方法和签名的原理。
产生Key
o产生RSA私钥(privatekey)
opensslgenrsa-3-outtestkey.pem2048
-3是算法的参数(publicexponent)。
2048是私钥长度。
testkey.pem是输出的文件。
o产生PKCS#10格式的认证请求。
所谓认证请求就是发给认证机构认证的一个请求,它主要包括一个公钥和一些相关信息(如组织名称和联系人地址)。
opensslreq-new-x509-keytestkey.pem-outtestkey.x509.pem-days10000/
-subj‘/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=androidandroid.’
如果不提供最后两个参数,openssl会提示你输入相关信息,这里的信息可以根据你自己的实际情况填写。
如:
opensslreq-new-x509-keytestkey.pem-outtestkey.x509.pem-days10000
Youareabouttobeaskedtoenterinformationthatwillbeincorporated
intoyourcertificaterequest.
WhatyouareabouttoenteriswhatiscalledaDistinguishedNameoraDN.
Therearequiteafewfieldsbutyoucanleavesomeblank
Forsomefieldstherewillbeadefaultvalue,
Ifyouenter‘.’,thefieldwillbeleftblank.
—–
CountryName(2lettercode)[GB]:
CN
StateorProvinceName(fullname)[Berkshire]:
GuangDong
LocalityName(eg,city)[Newbury]:
ShenZhen
OrganizationName(eg,company)[MyCompanyLtd]:
Topwise
OrganizationalUnitName(eg,section)[]:
Broncho
CommonName(eg,yournameoryourserver’shostname)[]:
EmailAddress[]:
bronchosalesgmail.
o把私钥的格式转换成PKCS#8(Private-KeyInformationSyntaxStandard.)
opensslpkcs8-intestkey.pem-topk8-outformDER-outtestkey.pk8-nocrypt
私钥是不能让别人知道的,否则就起不到的作用了。
私钥通常是要加密保存的,但这里指定了-nocryp,表示不加密。
Android提供了一个脚本mkkey.sh用来简化上面的步骤:
if["$1"==""];then
echo"Createatestcertificatekey."
echo"Usage:
$0NAME"
echo"WillgenerateNAME.pk8andNAME.x509.pem"
echo"/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=androidandroid."
return
fi
opensslgenrsa-3-out$1.pem2048
opensslreq-new-x509-key$1.pem-out$1.x509.pem-days10000/
-subj'/C=US/ST=California/L=MountainView/O=Android/OU=Android/CN=Android/emailAddress=androidandroid.'
opensslpkcs8-in$1.pem-topk8-outformDER-out$1.pk8-nocrypt
签名
Android提供了为jar/zip文件签名的程序signapk.jar。
它的用法如下:
Usage:
signapkpublickey.x509[.pem]privatekey.pk8input.jaroutput.jar
第一个参数是公钥,即前面第二步产生的testkey.x509.pem。
第二个参数是私钥,即前面第三步产生的testkey.pk8。
第三个参数是要签名的文件。
第四个参数是输出的文件(即签名后的文件)。
如:
java-jarsignapk.jartestkey.x509.pemtestkey.pk8update.zipupdate-signed.zip
现在我们来看看签名到底做了些什么:
o先为输入的jar/zip文件中的所有文件生成SHA1数字签名(除了CERT.RSA,CERT.SF和MANIFEST.MF)
for(JarEntryentry:
byName.values()){
Stringname=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())){
InputStreamdata=jar.getInputStream(entry);
while((num=data.read(buffer))>0){
md.update(buffer,0,num);
}
Attributesattr=null;
if(input!
=null)attr=input.getAttributes(name);
attr=attr!
=null?
newAttributes(attr):
newAttributes();
attr.putValue("SHA1-Digest",base64.encode(md.digest()));
output.getEntries().put(name,attr);
}
}
并把数字签名信息写入MANIFEST.MF
je=newJarEntry(JarFile.MANIFEST_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
manifest.write(outputJar);
o对manifest签名并写入CERT.SF
//CERT.SF
Signaturesignature=Signature.getInstance("SHA1withRSA");
signature.initSign(privateKey);
je=newJarEntry(CERT_SF_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureFile(manifest,
newSignatureOutputStream(outputJar,signature));
o把对输出文件的签名和公钥写入CERT.RSA。
//CERT.RSA
je=newJarEntry(CERT_RSA_NAME);
je.setTime(timestamp);
outputJar.putNextEntry(je);
writeSignatureBlock(signature,publicKey,outputJar);
签名的作用
签名的主要目的为了检测文件是否被别人修改了。
但它并不能禁止别人修改,因为你完全重新生成签名,但是你生成的签名和原来是不一样的。
分享到:
上一篇:
系统程序员成长计划-并发(四)(下)
下一篇:
系统程序员成长计划-并发(五)
androidapk签名(为什么如何做验证)
androidapk签名(为什么如何做验证)
这篇文章其实就是根据自己的疑问然后结合多个文章结合成的
文章引用:
liangxh2008.blog.163./blog/static/1646855/
.eoeandroid./thread-23010-1-1.html
pepa.iteye./blog/250991
jojol-zhou.iteye./blog/719428
一、为什么要签名:
1、发送者的身份认证,由于开发商可能通过使用相同的PackageName来混淆替换已经安装的程序,以此保证签名不同的包不被替换
2、保证信息传输的完整性,签名对于包中的每个文件进行处理,以此确保包中容不被替换,防止交易中的抵赖发生,Market对软件的要求
二、签名的说明:
1、所有的应用程序都必须有数字证书,Android系统不会安装一个没有数字证书的应用程序
2、Android程序包使用的数字证书可以是自签名的,不需要一个权威的数字证书机构签名认证
3、如果要正式发布一个Android应用,必须使用一个合适的私钥生成的数字证书来给程序签名,而不能使用adt插件或者ant工具生成的调试证书来发布
4、数字证书都是有有效期的,Android只是在应用程序安装的时候才会检查证书的有效期。
如果程序已经安装在系统中,即使证书过期也不会影响程序的正常功能
5、签名后需使用zipalign优化程序
6、Android将数字证书用来标识应用程序的作者和在应用程序之间建立信任关系,而不是用来决定最终用户可以安装哪些应用程序
三、签名的方法:
1、用eclipse插件方式签名
2、调试签名
eclipse插件默认赋予程序一个DEBUG权限的签名,此签名的程序不能发布到market上,此签名有效期为一年,如果过期则导致你无法生成apk文件,此时你只要删除debugkeystore即可,系统又会为你生成有效期为一年的新签名
b)开发者生成密钥并签名
右键点击项目名,在菜单中选择AndroidTools,然后选择ExportSignedApplicationPackage…,即可通过eclipse自定义证书并签名
c)开发者导出未签名的包
右键点击项目名,在菜单中选择AndroidTools,然后选择ExportSignedApplicationPackage…,即可导出未签名的包,之后可通过命令行方式签名
3、用命令行方式签名
使用标准的java工具keytool和jarsigner来生成证书和给程序签名
a)生成签名
$keytool-genkey-keystorekeyfile-keyalgRSA-validity10000-aliasyan
注:
validity为天数,keyfile为生成key存放的文件,yan为私钥,RSA为指定的加密算法(可用RSA或DSA)
b)为apk文件签名
$jarsigner-verbose-keystorekeyfile-signedjarsigned.apkbase.apkyan
注:
keyfile为生成key存放的文件,signed.apk为签名后的apk,base.apk为未签名的apk,yan为私钥
c)看某个apk是否经过了签名
$jarsigner–verifymy_application.apk
例如:
jarsigner-verify-verbose-certsabc.apk
每个签名的apk都会看到如下信息
sm152412WedOct1414:
16:
52CEST2009classes.dex
X.509,CN=Meebo,OU=Meebo,O=Meebo,L=MountainView,ST=California,C=US
[certificateisvalidfrom28/10/0806:
49to13/08/8207:
49]
否则就是没有签名
d)优化(签名后需要做对齐优化处理)
zipalign-v4your_project_name-unaligned.apkyour_project_name.apk
4、在源码中编译的签名
a)使用源码中的默认签名
在源码中编译一般都使用默认签名的,在某源码目录中用运行
$mmshowcommands能看到签名命令
Android提供了签名的程序signapk.jar,用法如下:
$signapkpublickey.x509[.pem]privatekey.pk8input.jaroutput.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.生成公钥
opensslgenrsa-3-outtestkey.pem2048
其中-3是算法的参数,2048是密钥长度,testkey.pem是输出的文件
ii.转成x509格式(含作者有效期等)
opensslreq-new-x509-keytestkey.pem-outtestkey.x509.pem-days10000-subj‘/C=US/ST=California/L=Mountain[email=View/O=Android/OU=Android/CN=Android/emailAddress=androidandroid.]View/O=Android/OU=Android/CN=Android/emailAddress=androidandroid.[/email]’
iii.生成私钥
opensslpkcs8-intestkey.pem-topk8-outformDER-outtestkey.pk8-nocrypt
把的格式转换成PKCS#8,这里指定了-nocryp,表示不加密,所以签名时不用输入密码
四、签名的相关文件
1)apk包中签名相关的文件在META_INF目录下
CERT.SF:
生成每个文件相对的密钥
MANIFEST.MF:
数字签名信息
xxx.SF:
这是JAR文件的签名文件,占位符xxx标识了签名者
xxx.DSA:
对输出文件的签名和公钥
2)相关源码
五、签名的相关问题
一般在安装时提示出错:
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES
1)两个应用,名字相同,签名不同
2)升级时前一版本签名,后一版本没签名
3)升级时前一版本为DEBUG签名,后一个为自定义签名
4)升级时前一版本为Android源码中的签名,后一个为DEBUG签名或自定义签名
5)安装未签名的程序
6)安装升级已过有效期的程序
6.相关工具
1)查看某个x509证书的的有效日期
签名具体步骤:
Apk签名首先要有一个keystore的签名用的文件.
keystore是由jdk自带的工具keytool生成的.具体生成方式参考一下:
开始->运行->cmd->cd到你安装的jdk的目录这里我是C:
\ProgramFiles\Java\jdk1.6.0_10\bin
然后输入:
keytool-genkey-aliasasaiAndroid.keystore-keyalgRSA-validity20000-keystoreasaiAndroid.keystore
-alias后跟的是别名这里是asaiAndroid.keystore
-keyalg是加密方式这里是RSA
-validity是有效期这里是20000
-keystore就是要生成的keystore的名称这里是asaiAndroid.keystore
然后按回车
按回车后首先会提示你输入密码:
这个在签名时要用的要记住了哦。
然后会再确认你的密码。
之后会依次叫你输入,组织单位,组织名称,城市区域,省份名称,国家代码等。
参考:
运行完可以在C:
\ProgramFiles\Java\jdk1.6.0_10\bin里找到刚才生产的keyStore文件
好现在开始给Apk签名了:
在C:
\ProgramFiles\Java\jdk1.6.0_10\bin还提供一个工具jarsigner.exe
好现在可以在刚才的命令行后继续运行以下命令给APK签名:
jarsigner-verbose-keystoreasaiAndroid.keystore-signedjarLotteryOnline_signed.apkLotteryOnline.apkasaiAndroid.keystore
-keystore:
keystore的名称
LotteryOnline_signed.apk是签完名后的APK
LotteryOnline.apk是签名前的apk
然后按回车:
会要求输入刚才设置的密码,输入后按回车就开始签名了。
参考:
运行成功后在C:
\ProgramFiles\Java\jdk1.6.0_10\bin目录下会多出一个被签名的apk文件,
参考:
如果这种方法不行,可以试试eclipse自带的方法,也是引用“窃”别人的文章^-^
1.Eclipse工程中右键工程,弹出选项中选择android工具-生成签名应用包:
2.选择需要打包的android项目工程:
3.如果已有私钥文件,选择私钥文件输入密码,如果没有私钥文件见第6和7步创建私钥文件:
4.输入私钥别名和密码:
5.选择APK存储的位置,并完成设置开始生成:
6.没有私钥文件的情况,创建私钥文件:
7.输入私钥文件所需信息,并创建:
补充:
如果需要最终发行你的android程序,必需为apk文件签名。
这里apk和jar的签名方式都是一样的,使用sunjdk的jarsigner工具来完成,但是执行时会提示jarsigner:
无法对jar进行签名:
java.util.zip.ZipException:
invalidentrycompressedsize(expectedxxxbutgotxxxbytes)这样的提示,
这些问题主要是由于资源文件造成的,对于android开发来说应该检查res文件夹中的文件,逐个排查。
这个问题可以通过升级系统的JDK和JRE版本来解决。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 中的 签名 机制