密码学
对称加密: 加密和解密使用的是同一把钥匙
对称加密分为 块加密 (几个字符一起进行加密,类似分组加密)和 流加密(挨个字符进行加密)
常见加密算法(一般和):DES (数据加密标准)、AES(高级数据加密标准)
特点:
1.加密速度
2.密文不可逆,密钥不能泄漏
3.如果在编码表上不能找到对应字符,会出现乱码
4.一般需要结合base64编码使用
对称加密流程图
base64(二进制转为ASCII字符)- 可读性算法 详细的不赘述
规则:由64个字符组成,大写的A-Z,小写的a-z,数字0-9,两个符号+和/
等号(=)说明:在base64编码中,需要设置一共是3个字节,为一组,如果在输出的时候,不够3个字节时,就需要=来进行补齐
非对称加密
必须要有两个密钥(公钥和私钥-密钥对)
如果使用公钥加密,必须使用私钥解密
如果使用私钥加密,必须使用公钥解密
常见非对称加密算法:RSA、ECC
非对称加密流程图
数字签名(含义:在网络传输数据的时候,给数据添加一个数字签名,表示是谁发送的数据,而且还能证明数据没有没篡改。)
公钥数字签名,只要信息的发送者,才能产生别人无法伪造的一段数字串,类似于写在普通纸质上的物理签名
基本原理
上面基本原理的流程,下面使用图解演示
数字证书
安卓APK打包流程
安卓APK打包流程是将开发好的安卓应用(源代码、资源文件等)编译并签名,最终生成一个可以安装在安卓设备上的APK文件。这个过程包含了多个步骤,从代码编译到签名、优化以及测试,具体步骤如下:
1. 编译源码
- 编译Java源代码:Android Studio 会自动将你的 Java 或 Kotlin 代码编译成字节码(
.class
文件),然后使用dx
或d8
工具将它们转化为 DEX(Dalvik Executable)格式。DEX文件最终会包含在APK中。 - 资源文件编译:资源文件(如XML布局文件、图片、字符串等)会被编译成适合不同设备的格式。Android Studio 会将这些资源文件存储为
.apk
文件中的res
目录。 - 生成 R.java 文件:Android Studio 会自动为每个资源生成一个
R.java
类,包含所有资源文件的引用。
2 .构建 APK
- 打包成APK:所有经过编译和处理的文件(DEX文件、资源文件、
AndroidManifest.xml
等)会被打包到一个.apk
文件中。这个APK文件是一个压缩文件,内部包含了应用的所有代码和资源。 - 配置
AndroidManifest.xml
:在这个文件中,声明应用的组件(如活动、服务、广播接收器等)、权限、应用的主题和其他配置信息。
4. 签名 APK
- 调试模式签名(Debug签名):在开发阶段,Android Studio 会使用默认的调试密钥(debug.keystore)对APK进行签名,这样你可以在设备上测试应用。调试签名用于开发和测试阶段。
- 发布模式签名(Release签名):
- 在发布APK之前,需要使用开发者自己生成的 发布证书(Keystore文件)对应用进行签名。此时,APK必须使用一个有效的私钥签名,否则将无法安装或更新。
- 你需要使用工具(如
keytool
生成Keystore文件,apksigner
或jarsigner
来签名)对应用进行签名。签名过程会确保APK的完整性和来源。
5. 生成APK
- 构建APK文件:通过
Build > Build APK
或Build > Generate Signed APK
操作,Android Studio会生成一个 APK 文件,这个文件可以通过USB或其他方式安装到安卓设备中。
6. 发布 APK
- 上传到应用市场:一旦APK文件准备Google Play、**华为应用市场华为应用市场、小米应用商店等)
- 在Google Play发布时,Google提供了App Signing by Google Play服务
- 发布到第三方平台:
7. 安装和验证
- 安装APK:用户可以通过设备直接安装APK文件。安卓系统会在安装时验证APK的签名,确保其来源合法且未被篡改。
- 验证签名:如果应用的签名不匹配(例如签名证书被修改或缺失),系统会提示安装失败。
APK文件与签名的关系
签名过程涉及证书(Keystore)和 APK 文件内容的结合,具体来说,签名的目的是确保 APK 文件的完整性和来源。打包过程中的签名过程有以下几个关键点,解释它们之间的关系:
1. APK文件与签名的关系
- 当你打包一个安卓应用(APK文件)时,APK的内容(包括代码、资源文件等)本身是不带签名的。签名过程就是将这个APK文件与一个签名证书关联起来。
- 这个签名过程是通过私钥对APK进行签名,签名后的APK可以确保:
- APK内容未被篡改。
- APK来自于一个特定的发布者(通过证书中的公钥验证)。
2. 签名的工作原理
- 签名证书(Keystore):包含公钥和私钥。私钥用于签名,公钥用于验证签名。
- 在打包过程中,签名工具(如
apksigner
或jarsigner
)使用私钥对 APK 文件的内容进行签名。具体来说,它会生成一个“签名文件”,该文件包括对 APK 内容的加密信息。
3. 签名生成的具体步骤
- 计算APK的哈希值:首先,签名工具会计算 APK 文件的哈希值(通常是 SHA-1 或 SHA-256),这个哈希值代表了 APK 文件的内容。
- 签名哈希值:然后,工具会用私钥对 APK 的哈希值进行签名(即加密哈希值),生成签名。
- 生成签名文件:签名工具将签名与证书相关信息一起打包成一个
.RSA
或.DSA
文件,并将该签名文件附加到 APK 中。
4. 签名与证书的关系
- 证书的哈希值(例如 MD5 或 SHA-1)用于标识签名证书的身份。签名证书中的公钥可以用来验证 APK 文件的签名是否有效。
- 但签名文件本身是包含了 APK 文件内容的签名,而不仅仅是证书的哈希值。
5. 打包后的 APK 的完整签名验证
- 当用户下载并安装 APK 时,系统会使用签名证书的公钥对 APK 进行验证。具体来说,它会使用证书的公钥来验证签名文件中的信息,确认 APK 文件是否在传输或存储过程中被篡改。
- 如果 APK 内容没有被修改并且签名有效,安装过程将继续;否则,系统会提示安装失败或签名无效。
6. 总结关系
- APK内容的哈希值(MD5/SHA-1/SHA-256)是计算出来的文件内容的唯一标识,随着APK文件内容的变化而变化。
- 签名证书的哈希值(MD5/SHA-1)是证书本身的唯一标识,跟APK的内容无关,用于标识证书身份。
- 签名过程:证书的私钥用来签名 APK 的内容(即哈希值),生成 APK 签名。这个签名在 APK 安装时被验证,确保 APK 没有被篡改,并且来源可信。
因此,签名过程中,证书的哈希值和APK内容的哈希值是两个不同的概念,但它们都在整个签名验证中发挥着不同的作用。
APK证书上的MD5和SHA-1与安卓打包后的APK文件的MD5或SHA-1签名是不同的。具体区别如下:
-
证书的MD5/SHA-1:
- 这是指签名证书本身(即Keystore中存储的公钥)的哈希值。
- 它用于标识证书的唯一性和验证证书的真实性,与APK内容无关。
-
APK的MD5/SHA-1:
- 这是指APK文件内容的哈希值,用于确认APK文件在传输或存储过程中是否被修改。
- 这个哈希值会随着APK内容的变化而变化,而与证书无关。
签名过程:在打包时,签名证书对APK文件进行签名,产生一个签名文件。签名本身(包括公钥和私钥)是与证书相关的,但APK文件的哈希值(MD5或SHA-1)与APK内容紧密相关。
简言之,证书的哈希值和APK文件的哈希值是两回事,一个是对证书本身的验证,一个是对APK文件内容的验证。