什么是签名,签名有什么用
Android APP都需要我们用一个证书对应用进行数字签名,不然的话是无法安装到Android手机上的,平时我们调试运行时到手机上时,是AS会自动用默认的密钥和证书来进行签名;但是我们实际发布编译时,则不会自动签名,这个时候我们就需要进行手动签名了!为我们的APK签名有以下好处:
首先我们看下效果图
一、生成keystone文件
了解下加解密算法的分类
加解密算法基本上可以分为三类,它们分别是对称性解密算法、非对称性加密算法和消息摘要算法。每一类算法中又有多个不同的具体算法。对于这些算法,我们不要求完全掌握,但是对于各类算法的特点和用途是一定要了解的,对于一些常见的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它们分别属于哪类算法。
对称性加密算法使用同一个密钥对信息进行加密和解密,其信息的安全性一部分取决于加密算法和密钥的长度,另一部分取决于密钥在传递过程中是否会被截获或盗取。非对称性加密算法使用两个密钥分别对信息进行加密和解密,这两个密钥称为私钥/公钥对。使用私钥加密的信息必须使用公钥解密,反之亦然。公钥可以公开发布,私钥由加密方保存,绝对不公开,将私钥被截获或窃取的可能性降到最低,因此非对称性加密算法的安全性比对称性加密算法的安全性更高。既然非对称性加密算法比对称性加密算法安全性更高,那对称性加密算法有什么存在的必要呢?这是因为对称性加密算法的运算速度更快。现实中,往往将对称性加密算法和非对称性加密算法结合使用,对于要传输的大块数据使用对称性加密算法加密,然后对加密使用的密钥使用非对称性加密算法进行加密,这样既可以获得更高的安全性,又可以获得更高的加解密运算速度。常用的对称性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非对称性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(椭圆曲线加密算法)。
消息摘要算法的主要目的是对数据生成摘要。消息摘要算法不需要密钥,只有输入相同的数据才能得到相同的摘要,而且不可能从摘要反过来推算出数据。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的变体。它们可以用来保证数据的完整性,在网络上发布文件时,常同时提供该文件的MD5值就是利用的消息摘要算法的这个特点,一旦该文件被篡改或者在网络传输中出现数据错误,再对其进行摘要运算就得不到相同的MD5值。
对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者,他再怎么抵赖也没有用。
Keytool 是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里,包含两种数据:密钥实体(Key entity)-密钥(secret key)或者是私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)-只包含公钥
Keytool工具位于JDK 目录下的bin 目录下keytool.exe 一般配置了环境变量path都可以直接使用
使用Keytool生成自己的密钥
keytool -genkey -alias tudou.keystore -keyalg RSA -validity 20000 -keystore tudou.keystore
参数说明:
-alias xxx 产生别名 每个keystore 都有关联的这个独一无二的alias 别名通常不区分大小写
-keyalg RSA 指定加密算法 这里指定的是 RSA
-validity 20000 指定证书的有效时间 单位:天 这里指定的是20000天
-keystore xxx 指定密钥库的名称
输入以上命令以后直接回车,会提示 输入密钥库口令:输入完成后再重复输入一遍 (输入的口令不能少于6位,而且输入的时候你看不见,安全起见嘛)
回车以后按照提示一步一步设置
如下图我定义的:
查看密钥证书
keytool -list -v -keystore 密钥路径
[root@hejianlai-jenkins ~]# keytool -list -v -keystore tudou.keystore Enter keystore password: Keystore type: JKS Keystore provider: SUN Your keystore contains 1 entry Alias name: tudou.keystore Creation date: Jun 26, 2018 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN Issuer: CN=He, OU=Pcidata, O=Pcidata Group, L=Guangzhou, ST=Guangdong, C=CN Serial number: fd5bed2 Valid from: Tue Jun 26 16:30:26 CST 2018 until: Wed Mar 29 16:30:26 CST 2073 Certificate fingerprints: MD5: 07:63:47:F3:96:92:E0:6B:49:D7:2F:68:3C:5D:0E:51 SHA1: DA:46:86:62:8D:22:78:0A:51:66:3F:78:5F:37:91:9F:F4:D6:63:1B SHA256: 1D:98:8E:31:01:D4:43:0A:E0:2C:A2:37:4F:83:EB:38:A2:80:45:FD:46:BC:4C:FC:59:B6:A0:4E:D3:B9:72:62 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3 Extensions: #1: ObjectId: 2.5.29.14 Criticality=false SubjectKeyIdentifier [ KeyIdentifier [ 0000: E0 DC CF A9 5B 0C 5D 9C A2 F8 48 52 4C 83 23 36 ....[.]...HRL.#6 0010: 8B 25 3B C3 .%;. ] ] ******************************************* ******************************************* Warning: The JKS keystore uses a proprietary format. It is recommended to migrate to PKCS12 which is an industry standard format using "keytool -importkeystore -srckeystore tudou.keystore -destkeystore tudou.keystore -deststoretype pkcs12".
二、配置build.gradle文件
下面是配置build.gradle文件我的路径是/app/build.gradle
apply plugin: ‘com.android.application‘ android { compileSdkVersion 26 buildToolsVersion "26.0.2" defaultConfig { applicationId "com.pci.securigydemotest" minSdkVersion 19 targetSdkVersion 26 versionCode 1 versionName "1.3" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" //添加签名文件 signingConfigs { release { storeFile file("/root/keyless.keystore") //签名文件全路径 storePassword "123456" keyAlias "keyless.keystore" keyPassword "123456" } } //设置打包格式 applicationVariants.all { variant -> variant.outputs.each { output -> def outputFile = output.outputFile if (outputFile != null && outputFile.name.endsWith(‘.apk‘)) { // 输出apk名称为Pos_v1.0.0_201709251000_.apk def fileName = "Securigy_${defaultConfig.versionName}_201806281954_${variant.productFlavors[0].name}_1.3.apk" output.outputFile = new File(outputFile.parent, fileName) } } } //自定义apk名字 productFlavors { Develop { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Develop"] } Alpha { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Alpha"] } Beta { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Beta"] } Gamma { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Gamma"] } Demo { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Demo"] } Current { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "Current"] } } } buildTypes { release { signingConfig signingConfigs.release minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro‘ } }
在jenkins上构建完之后就可以查看apk是否签名成功
[root@hejianlai-jenkins apk]#jarsigner -verbose -certs -verify Securigy_1.3_201806281954_Alpha_1.3.apk
原文:https://www.cnblogs.com/Dev0ps/p/9240693.html