Android Keystore漫谈

写在前面

今天使用高德地图为应用添加Key的时候,发现有一项需要用到安全码SHA1,而SHA1存在于Keystore中,遂简单地了解了一下Keystore。虽然之前实习开发中有用同事生成的Keystore对应用加过密,但是对它并不熟,今天以此文对Keystore的认识做一个记录,也希望可以给未接触过Keystore的小伙伴们作为参考。

为什么使用Keystore?

为什么使用Keystore?在回答这个问题前,我们先来看看Keystore是什么东西。我们都知道,古时丫鬟被买下时,主人要求丫鬟签写卖身契,表示这个丫鬟是老王头家的。Keystore就如同卖身契,表示这个APP是某一名开发者开发的。有了Keystore,开发者在发布自己的应用到市场时,就无需担心自己的APP被他人抢走了,因此使用Keystore很有必要。

那么Keystore怎么证明APP开发者的身份呢?在生成Keystore的时候,开发者会录入自己姓名、单位、组织、所在城市、省份、国家代码等信息以保证此Keystore是自己的,将录入自己信息的Keystore放入APP中,这样就可以保证这个APP是自己开发的了。

此处添加莫再讲xml对 *Keystore放入APP** 的纠正和补充*:

Keystore 传统理解为密钥库,或者钥匙串。一个keystore里面可以放多组秘钥,每组密钥都有有效期、地址、公司等信息,可以通过别名来进行区分拿取。开发者将录入自己信息的秘钥(而非秘钥库Keystore)存入APP中,以认证此APP为自己开发。

Keystore可理解为一个容器,存放开发者信息、私钥、公钥的容器。乍一听,未接触过密码学的小伙伴们可能会对这些名词感到陌生,接下来我们来简单了解一下Keystore相关名词。

名词解释

加密

为了防止我的信息数据被不想看到的人看到,用特殊的算法打乱(信息内容的改变,而非简单的顺序改变)原来的信息数据,使他人即使得到打乱后的信息数据也无法理解其中的含义。

解密

为了看懂被打乱的信息数据,使用特殊的算法将打乱后的信息数据还原成原来的内容,以理解其中的含义。

实体

原始未被打乱的信息数据,密码学称之为明文,在Keystore里面我们称之为实体

公钥

加密过程中,算法为了提高其加密程度,传入一个参数,使同一个算法在不同参数的作用下产生不同的加密效果。公钥持有者一般为群体,其作用是验证加密

私钥

通过传入与公钥钥配对的私钥到算法中,实现解密的效果。一般私钥由个人持有,需妥善保管,不可告诉他人,其作用是解密签章。关于私钥、公钥的知识,在此不做过多讲解,引用公钥和私钥中的内容,相信小伙伴们会有点收获。

比如说,我要给你发送一个加密的邮件。首先,我必须拥有你的公钥,你也必须拥有我的公钥。

首先,我用你的公钥给这个邮件加密,这样就保证这个邮件不被别人看到,而且保证这个邮件在传送过程中没有被修改。你收到邮件后,用你的私钥就可以解密,就能看到内容。

其次我用我的私钥给这个邮件加密,发送到你手里后,你可以用我的公钥解密。因为私钥只有我手里有,这样就保证了这个邮件是我发送的。

数字签名

实体经私钥加密后得到的数据。它可以通过公钥来解密,从而将解密后的内容与实体进行比对,来验证信息数据是否被篡改过。关于数字签名更深入的了解,可参考《一文读懂数字签名》一文。

别名

用来区分Keystore的唯一标识(字符串)。

默认Keystore和自定义Keystore

通过对Keystore相关名词的了解,我们大致清楚Keystore其实就是验证APP开发者身份的一个文件。Keystore分为默认Keystore和自定义Keystore,通常应用发布时不用默认的Keystore,因为它不包含开发者的有效信息,且密码是android,任何人都可通过keytool指令对其内容进行修改,无法验证APP的有效性。默认Keystore的存放位置为$HOME/.android/debug.keystore,若Android Studio打包签名apk的时候未找到默认的Keystore时会自动创建它。自定义Keystore可使用Keytool指令或Android Studio来生成,接下来我们来了解自定义KeyStore的生成方式。

Keytool指令参数

Keytool是一个很有用的安全钥匙和证书的管理工具,使用该指令可实现密钥库(Keystore)的创建和查看等操作。我们先来看一下Keytool指令相关的参数。

-genkey

在用户主目录中创建密钥库(Keystore),后缀名为.keystore。

-alias [alias]

产生别名,后面跟别名内容。若未指定,则别名默认为mykey.

-keystore

指定.keystore文件的名称,如:

keytool -genkey -keystore dmkf.keystore

用户主目录中会产生名称为dmkf.keystore的Keystore文件。若未使用该参数,则文件名默认为.keystore

-keyalg [DSA/RSA]

指定密钥的算法,未指定时默认为DSA算法。

-validity

指定创建的证书有效期,单位为。未指定时默认为1天。

-dname

证书持有者(APP开发者)信息。

CN:名字或姓氏

OU:组织单位名称

O:组织名称

L:城市或区域名称

ST:州或省份名称

C:单位的两字国家代码

-list

显示证书信息。

-v

显示证书详细信息。

-export

结合-alias导出指定的证书信息。如:

keytool -export -alias dmkf -keystore dmkf.keystore -file D:/mykeystore/myexport.crt

-import

将已签名的证书导入到密钥库,如:

keytool -import -alias dmkf -keystore mystore.keystore -file D:/mykeystore/myanother.crt

-keysize

指定密钥长度。

-storepass

操作密钥库所需的密码。

-storepasswd

修改操作密钥库所需的密码。

-keypass

指定别名条目的密码(私钥的密码)。

-keypasswd

修改指定别名条目的密码。

-file

结合-export,指定导出的证书位置及证书名称。

-delete

删除密钥库中某一条目。如:

keytool -delete -alias dmkf -keystore dmkf.keystore

-printcert

查询导出的证书信息,如:

keytool -printcert -file D:/mykeystore/dmkf.crt

常用Keytool指令操作

创建Keystore文件

生成一个别名为dmkf,名为dmkf.keystore的文件。

1
keytool -genkey -alias dmkf -keystore dmkf.keystore -keyalg RSA

查看Keystore文件

查看名为dmkf.keystore的Keystore文件信息。

1
2
keytool -list -v -keystore dmkf.keystore
Enter keystore password: ****(输入Keystore操作密码)

输出Keystore证书

从密钥库dmkf.keystore中导出别名为dmkf的证书到dmkf.crt文件中(导出的证书中包括主体信息和公钥)。

1
2
keytool -export -alias dmkf -keystore dmkf.keystore -file dmkf.crt
Enter keystore password: ****(输入Keystore操作密码)

查看导出的证书信息

查看导出并保存在dmkf.crt文件中的证书信息。

1
keytool -printcert -file dmkf.crt

导入证书

从名为dmkf.crt文件中取出别名为dmkf的证书信息导入到名为truststore.keystore密钥库中。

1
keytool -import -alias dmfk -keystore truststore.keystore -file dmkf.crt

Android Studio生成Keystore

打开Android Studio,在菜单栏中找到Build,单击弹出下拉框,选择Generate Signed APK...

Generate Signed APK...

选择app,单击Next按钮。

Generate Signed APK

单击Create new…按钮。

Generate Signed APK

在弹出的New Key Store窗口中选择Keystore存放路径,设置Keystore密码、别名、别名密码、有效期以及个人信息,单击OK按钮完成Keystore的创建。

New Key Store

此时Android Studio自动填充新建的Keystore相关信息,至此Android Studio已完成Keystore的创建。若想用这个Keystore继续打包APK,单击Next按钮。

Generate Signed APK

设置密码数据库的密码,单击OK按钮,进入下一步。

设置密码数据库的密码

选择好APK导出的位置和编译方式(发布/调试),单击Finish按钮完成APK的打包。

Paste_Image.png

在项目根目录的app文件夹里可以找到命名为app-release.apk的apk文件。

生成apk

以上就是本次Keystore漫谈的所有内容,有不准确的地方,欢迎在文章下方的评论处评论指正!

参考

再小的鼓励也是一种支持!