一、数字签名概述
所谓"数字签名"就是通过某种密码运算生成一系列符号及代码组成电子密码进行签名,来代替书写签名或印章。
数字签名有两种功效:一是能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。二是数字签名能确
定消息的完整性。因为数字签名的特点是它代表了文件的特征,文件如果发生改变,数字签名的值也将发生变化。
二、Android系统中数字签名的使用范围
目前在android系统中,在两个地方使用了数据签名,一是应用程序,二是OTA升级。
应用程序中使用数字签名主要用来标识程序的唯一性。OTA升级中使用数字签名主要用来验证数据的完整性。
三、生成数字签名的方法
1、用Java中的数字签名工具keytool
签名首先要有一个keystore文件。keystore是由jdk自带的工具keytool产生,
window上生成的具体方式如下:
开始-〉运行->cmd->cd到你安装的jdk下的bin目录下, 然后输入
keytool -genkey -alias test.keystore -keyalg RSA -validity 10000 -keystore test.keystore
然后按回车首先提示输入密码, 然后会确认你的密码,之后会依次叫你输入相关信息如姓名,组织单位等之后就是输入
test.keystore 主密码(如果和keystore密码相同,按回车)我在这里设和keystore相同,之后你就会在bin目录下找到生成
的test.keystore。
相关参数意义如下:
-alias 后跟的是别名, 这里是test.keystore-keyalg是加密方式这里是RSA-validity是有效期这里是10000天-keystore就是要生成的keystore的名称,这里是test.keystore
keystore生成后,现在可以进行签名了, 现在把你要进行签名的apk放到一个当前目录下,然后利用jdk提供的工具
jarsigner.exe进行签名,具体操作如下:
jarsigner -verbose -keystore test.keystore -signedjar new.apk test.apk test.keystore
2、在源码下进行签名
Android源码目录development\tools下有make_key脚本, 用来生成一个密钥对, 这个密钥对与keytool生成的key在形式上不
一样,但内容和作用是一致的。
生成公钥:
openssl genrsa -3 -outtestkey.pem 2048
转换成X509证书格式:
openssl req -new -x509 -key testkey.pem -out testkey.x509.pem -days 10000-subj ‘xx’
生成私钥:
openssl pkcs8 -in testkey.pem-topk8 -outform DER -out testkey.pk8 –nocrypt
APK签名命令:
java -jar signapk publickey.x509[.pem]privatekey.pk8 input.apk output.apk
升级包进行签名: (注:理论上用keytool应该也能对升级包进行签名,但目前我还不知道具体步骤)
java -jar signapk –w publickey.x509[.pem]privatekey.pk8 input.zip output.zip