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是自己开发的了。

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文件的名称,如:

1
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导出指定的证书信息。如:

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

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

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

-keysize
指定密钥长度。
-storepass
操作密钥库所需的密码。
-storepasswd
修改操作密钥库所需的密码。
-keypass
指定别名条目的密码(私钥的密码)。
-keypasswd
修改指定别名条目的密码。
-file
结合-export,指定导出的证书位置及证书名称。
-delete
删除密钥库中某一条目。如:

1
keytool -delete -alias dmkf -keystore dmkf.keystore

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

1
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漫谈的所有内容,有不准确的地方,欢迎在文章下方的评论处评论指正!

参考

android keystore sha1 md5的理解
Android Studio中的keystore
Android Studio 默认keystore 以及自定义keystore
Andriod Studio debug.keystore(默认)和如何生成自定义的keystore 以及如何生成数字签名
android keystore sha1 md5的理解
keystore 介绍
关于keystore的简单介绍

坚持原创技术分享,您的支持将鼓励我继续创作