前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android Keystore漫谈

Android Keystore漫谈

作者头像
代码咖啡
发布2018-08-28 09:56:24
2K0
发布2018-08-28 09:56:24
举报
文章被收录于专栏:程序员叨叨叨程序员叨叨叨

写在前面

今天使用高德地图为应用添加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文件的名称,如:

代码语言:javascript
复制
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导出指定的证书信息。如:

代码语言:javascript
复制
keytool -export -alias dmkf -keystore dmkf.keystore -file D:/mykeystore/myexport.crt

-import

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

代码语言:javascript
复制
keytool -import -alias dmkf -keystore mystore.keystore -file D:/mykeystore/myanother.crt

-keysize

指定密钥长度。

-storepass

操作密钥库所需的密码。

-storepasswd

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

-keypass

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

-keypasswd

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

-file

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

-delete

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

代码语言:javascript
复制
keytool -delete -alias dmkf -keystore dmkf.keystore

-printcert

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

代码语言:javascript
复制
keytool -printcert -file D:/mykeystore/dmkf.crt

常用Keytool指令操作

  • 创建Keystore文件 生成一个别名为dmkf,名为dmkf.keystore的文件。
代码语言:javascript
复制
keytool -genkey -alias dmkf -keystore dmkf.keystore -keyalg RSA
  • 查看Keystore文件 查看名为dmkf.keystore的Keystore文件信息。
代码语言:javascript
复制
keytool -list -v -keystore dmkf.keystore
Enter keystore password: ****(输入Keystore操作密码)
  • 输出Keystore证书 从密钥库dmkf.keystore中导出别名为dmkf的证书到dmkf.crt文件中(导出的证书中包括主体信息和公钥)。
代码语言:javascript
复制
keytool -export -alias dmkf -keystore dmkf.keystore -file dmkf.crt
Enter keystore password: ****(输入Keystore操作密码)
  • 查看导出的证书信息 查看导出并保存在dmkf.crt文件中的证书信息。
代码语言:javascript
复制
keytool -printcert -file dmkf.crt
  • 导入证书 从名为dmkf.crt文件中取出别名为dmkf的证书信息导入到名为truststore.keystore密钥库中。
代码语言:javascript
复制
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的简单介绍

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.02.19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 为什么使用Keystore?
  • 名词解释
  • 默认Keystore和自定义Keystore
  • Keytool指令参数
  • 常用Keytool指令操作
  • Android Studio生成Keystore
  • 参考
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档