加密算法¶
哈希算法¶
Hash,一般译作哈希,或者散列
哈希算法可以将一段任意长度的数据生成独一无二的固定长度(2的N次方)的哈希值(也叫散列值,或摘要),哈希值是不可逆的,无法解密
不同 Hash 算法之间区别不大,只是哈希结果不同
如果两段输入的哈希结果不同,可以百分百确定两段输入是不同的,反之,说明输入数据理论上是相同的,但也存在一定的不可靠性
比特币产生出新的区块,就是将区块头哈希然后满足一定条件后算出来的,可以参考示例:https://andersbrownworth.com/blockchain/
- MD5
MD5 可以把任意长度的明文转化成一串 128bits 的哈希值,已被证明不具有强抗碰撞性
此外还有 MD2、MD4、MD6 等
- SHA
Secure Hash Algorithm,哈希函数族目前有三代标准
SHA-1 1995,已被证实不具备强抗碰撞性
SHA-2 2002,目前用的最多,比如 SHA-256, SHA-512等
SHA-3 2003,开销更低、计算效率更高
- RIPEMD160
比特币生成地址时使用的算法
- Keccak-256
以太坊钱包地址,就是将公钥经过这个哈希算法,再取后面的 20 个字节生成的
对称加密算法¶
加密与解密时采用同一个密钥,效率高,但安全系数较低。
通常用于 C/S 间的流量加密,以及磁盘上的数据加密
常见的算法有:
DES 数据加密标准,基于此的算法有时称作 DEA
IDEA 国际数据加密算法
AES 高级加密标准
RC4
非对称加密算法¶
https://andersbrownworth.com/blockchain/public-private-keys/keys
非对称加密算法将密钥分成公钥和私钥,针对相同的内容,私钥和公钥可以得到相同的信息
- 私钥:64 个十六进制字符(32Bytes, 256bits),由用户自行保管,不参与任何通信传输
- 公钥:128 个十六进制字符(68Bytes, 512bits),可以完全公开,无须保证传输安全
使用私钥加密,公钥解密,效率低,但安全系数较高。
数字签名¶
RSA
DSA 电子签名算法
ECDSA(Elliptic Curve Digital Signature Algorithm) 椭圆曲线数字签名算法,使用椭圆加密(ECC)的 DSA 变体,被比特币和以太坊,以及 iOS 大量使用
将一段信息进行哈希(比如用 keccak256 将一笔交易哈希),然后使用私钥给哈希值签名,每个拿到公钥的人都可以验证它
验证通过则说明:
- 信息来源没有问题,因为签名无法被伪造
- 信息没有被篡改过,改过则哈希会变
- 继而说明签名者不可抵赖
示例参考:https://andersbrownworth.com/blockchain/public-private-keys/transaction
数字证书¶
为了证明公钥是可信的,引入了 PKI(Public Key Infrastructure 公开密钥基础设施),由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
颁发机构¶
CA(Certificate Authority,证书颁发机构),对公钥拥有者做专业认证,认证通过后颁发数字证书(digital certificate),将数字证书内置到操作系统,建立一个信任链,以此保证公钥的可信
CA 按安全等级从低到高可分为
DV:只验证申请域名的所有权
OV:需对申请者/组织的身份做验证
EV:需经过法律和审计的严格核查
CA 按保护域名的数量分为
单域名版:只保护一个域名
多域名版:保护多个域名
通配符版:保护主域名下同一级的所有子域名
全球最大的七家 CA 组成了 CASC 证书颁发机构理事会: Comodo、Symantec、Trend Micro、DigiCert、Entrust、GlobalSign、GoDaddy,CASC
CASC 的成员必须遵守 CA/Browser Forum(证书机构与浏览器论坛)制定的标准,即 PKI,目前最新标准为 X.509 v3
审核并不一定是要提交给最大的这几个 CA,因为除了这些之外,还有一些大大小小的中介 CA,他们会组成一条条信任链,通过信任链的层层认证,最终也会被信任。
不过机构越权威,安全等级也就越高,但同时也需要付出更多的费用
是的,申请数字证书是要花钱的,而且还不便宜,因为这背后需要很多安全和法律成本,并不是随便一个机构就能搞定的事情,不过也有免费的。
如图,可以看到 github.com
的信任链,颁发者是由全球最大 CA 之一 DigiCert 认证的
这些顶级的 CA 机构是由谁认证呢,答案是他们自己给自己认证,当然前提是因为这些顶级机构有足够的实力和信誉我们才选择相信他,就像各个国家的中央机构,你只能选择相信,不然整个社会体制就无法正常运转下去,言归正传,这些顶级 CA 会给自己签发一个数字证书,通常被称为「根证书」,这些根证书会被预置在我们的操作系统以及浏览器中,系统会定期检查他们是否已被吊销,尽可能保持最新可信状态。
分类和格式¶
- 系统证书:操作系统内置的,需要有 Root 权限才能进行添加或删除
- 用户证书:用户自行安装的
不要轻易安装盗版操作系统,如果从根儿上就已经不安全了,那么整个信任链也就没有安全可言。
证书格式
DER 一种二进制编码,其文件扩展名为 .cer、.der、.crt
PEM 一种 Base-64 编码
PKCS 用于在单个文件中交换公有和私有对象。扩展名是 .p7b、.p7c、.p12 等
申请流程¶
作为服务端/申请者,如果想让自己的公钥被客户端所信任,需要将公钥以及一些必要信息等制作成一个 CSR(Certificate Signing Request 证书签发请求)文件,通过可信网络提交给 CA 审核。
CA 审核通过后,会按照 X.509 标准的格式,将所有的必要信息通过哈希/散列函数压缩成一串固定长度的哈希值,称之为「信息摘要」。这是一个不可逆过程,如果信息被篡改,则哈希值会变,以此保障信息的完整性。
然后会通过 CA 私钥把这些信息和信息摘要一起进行加密,因为 CA 私钥由 CA 保管,所以没有私钥的人无法实现这一过程,所以称之为数字签名,至此就生成了一个可信赖的数字证书。
一个证书通常包含以下信息:
CA 信息
CA 的数字签名
CA 生成证书所用的摘要和非对称签名算法
持有者公钥
持有者唯一标识符,通常为域名
序列号,CA 分配给证书的唯一标识符
版本号,指出该证书使用了哪种版本的 X.509 标准
有效期
最后,CA 将数字证书颁发给申请者,申请者会将其部署到服务器中,在收到客户端请求后将数字证书返回,客户端收到数字证书后,会对数字证书进行验证。