2017年11月15日星期三

密码学常用算法及应用场景

1. 常用密码学算法及概念

  • Hash (消息摘要)
  • Merkle 树
  • 对称加密
  • 非对称加密

1.1 Hash (消息摘要)

1.1.1 定义

能将任意长度的数据(明文)映射为较短的固定长度的数值(Hash 值),并且不同的明文很难映射为相同的 Hash 值

1.1.2 算法特性

  • 正向快速:给定明文和 hash 算法,在有限时间和有限资源内能计算出 hash 值
  • 逆向困难:给定(若干) hash 值,在有限时间内很难(基本不可能)逆推出明文
  • 输入敏感:原始输入信息修改一点信息,产生的 hash 值看起来应该都有很大不同
  • 冲突避免:很难找到两段内容不同的明文,使得它们的 hash 值一致(发生冲突)

1.1.3 典型代表

  • MD5(128位), SHA1(160位), SHA2 (SHA-224/SHA-256/SHA-384/SHA-512), AEAD
  • MD5 和 SHA1 已经不再安全,推荐使用 SHA2-256/SHA2-512

1.1.4 用法举例

echo "hello world"|shasum -a 256
# a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447

echo "hello w0rld"|shasum -a 256
# fa0dbd233c91bdb55e2bda390ee2149eaad830a1a40b7bb1d7adf7c3b30e091d

1.2 Merkle 树 (默克尔树)

1.2.1 定义

默克尔树(又叫哈希树)是一种二叉树,由一个根节点、一组中间节点和一组叶节点组成。最下面的叶节点包含存储数据或其哈希值,每个中间节点是它的两个孩子节点内容的哈希值,根节点也是由它的两个子节点内容的哈希值组成。

1.2.2 算法特性

默克尔树的特点是,底层数据的任何变动,都会传递到其父亲节点,一直到树根。

1.2.3 应用场景

  • 快速比较大量数据:当两个默克尔树根相同时,则意味着所代表的数据必然相同。
  • 快速定位修改:例如上例中,如果 D1 中数据被修改,会影响到 N1,N4 和 Root。因此,沿着 Root --> N4 --> N1,可以快速定位到发生改变的 D1;
  • 零知识证明:例如如何证明某个数据(D0……D3)中包括给定内容 D0,很简单,构造一个默克尔树,公布 N0,N1,N4,Root,D0 拥有者可以很容易检测 D0 存在,但不知道其它内容。

1.3 对称加密

1.3.1 定义

加密和解密使用的密钥相同

1.3.2 算法特性

  • 加解密效率高(速度快,空间占用小),加密强度高
  • 参与多方都需要持有密钥,一旦有人泄露则安全性被破坏

1.3.3 代表算法

  • DES (Data Encryption Standard)
经典的分组加密算法,1977 年由美国联邦信息处理标准(FIPS)所采用 FIPS-46-3,将 64 位明文加密为 64 位的密文,其密钥长度为 56 位 + 8 位校验。现在已经很容易被暴力破解。
  • AES (Advanced Encryption Standard)
美国国家标准研究所(NIST)采用取代 DES 成为对称加密实现的标准,1997~2000 年 NIST 从 15 个候选算法中评选 Rijndael 算法(由比利时密码学家 Joan Daemon 和 Vincent Rijmen 发明)作为 AES,标准为 FIPS-197。AES 也是分组算法,分组长度为 128、192、256 位三种。AES 的优势在于处理速度快,整个过程可以数学化描述,目前尚未有有效的破解手段。
  • CHACHA20
  • RC4

1.4 非对称加密

1.4.1 定义

加密密钥和解密密钥是不同的,分别称为公钥和私钥。
非对称加密是现代密码学历史上最为伟大的发明(没有之一)

1.4.2 算法特性

  • 公钥一般是公开的,人人可获取的,私钥一般是个人持有,不能被他人获取
  • 公私钥分开,在不安全的通道上也可以使用
  • 加解密速度慢,一般比对称加解密算法慢两到三个数量级,加密强度相比对称加密要差

1.4.3 代表算法

  • RSA 【数字签名、密钥交换、公钥加密】
经典的公钥算法,1978 年由 Ron Rivest、Adi Shamir、Leonard Adleman 共同提出,三人于 2002 年获得图灵奖。 算法利用了对大数进行质因子分解困难的特性,目前互联网上大部分机构所颁发的证书还是基于 RSA 算法

  • DH (Diffie–Hellman) 【密钥交换】
基于离散对数无法快速求解。用于密钥交换,可以让双方在完全没有对方任何预先信息的条件下通过不安全信道创建起一个密钥 

  • DSA (Digital Signature Algorithm)【数字签名】
与 RSA 的签名机制类似
  • 椭圆曲线算法(Elliptic curve cryptography,ECC)
现代备受关注的算法系列,基于对椭圆曲线上特定点进行特殊乘法逆运算难以计算的特性。最早在 1985 年由 Neal Koblitz 和 Victor Miller 分别独立提出。ECC 系列算法一般被认为具备较高的安全性,但加解密计算过程往往比较费时。
  • ECDH (Elliptic Curve Diffie-Hellman) 【密钥交换】
DH 算法有一个变种,它与 DH 类似,ECDH 依赖的是——求解“椭圆曲线离散对数问题”的困难。
  • ECDSA (The Elliptic Curve Digital Signature Algorithm) 【数字签名】
基于椭圆曲线的数字签名算法
  • ECIES (Elliptic Curve Integrated Encryption Scheme) 【密钥交换、公钥加密】
基于椭圆曲线的公钥加密算法

2. 区块链中的密码学应用场景

2.1 数字签名

2.1.1 定义

类似在纸质合同上签名确认合同内容,数字签名用于证实某数字内容的完整性(integrity)和来源(或不可抵赖,non-repudiation)。

2.1.2 应用场景

一个典型的场景是,A 要发给 B 一个文件(一份信息),B 如何获知所得到的文件即为 A 发出的原始版本?
  • A 先对文件进行摘要,然后用自己的私钥进行加密,将文件和加密串都发给 B
  • B 收到后文件和加密串,用 A 的公钥来解密加密串,得到原始的数字摘要,跟对文件进行摘要后的结果进行比对
  • 如果一致,说明该文件确实是 A 发过来的,并且文件内容没有被修改过
简单的数字签名


2.2 PKI 体系

2.2.1 定义

公钥基础设施(PKI)用于描述管制或操纵证书与公钥及私钥的策略、标准和软件。实际上,PKI 是指由数字证书、证书颁发机构 (CA) 以及对电子交易所涉及各方的合法性进行检查和验证的其它注册机构组成的一套系统。PKI 的有关标准仍处于不断发展之中,即使这些标准已被作为电子商务的要素而广泛实施。
X.509 - 是由国际电信联盟(ITU-T)制定的数字证书标准
PKCS - 是由美国RSA数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。(X.509的技术实现细节)
PKI 严重依赖于 CA 的权威性,属于 Fabric 联盟链特有的。比特币和以太坊等公有链完全不需要 PKI 这套体系

2.2.2 PKI 中的主要概念

  • 证书(公钥证书)
里面主要存储证书所有者的公钥等基本信息,含有 CA 的数字签名,CA 要对它所签名的证书负责
  • 证书颁发机构 (CA)
是向个人、计算机或任何其它申请实体颁发证书的可信实体。CA 受理证书申请,根据该 CA 的策略验证申请人的信息,然后使用它的私钥把其数字签名应用于证书。
  • 注册
是实体向 CA 自我介绍的过程。在申请证书时,注册可以是隐含的,或通过为主体提供担保的另一个可信实体(如智能卡登记站)来完成
  • 证书登记
是最终实体进行证书申请并从 CA 接收证书的过程
  • 证书吊销
证书具有一个指定的寿命,但 CA 可通过称为证书吊销的过程来缩短这一寿命。CA 发布一个证书吊销列表 (CRL),列出被认为不能再使用的证书的序列号

2.2.3 PKI 在 HTTPS(TLS) 中的应用

https 简要流程

  • 消息摘要使用: SHA256/MD5/SHA1/AEAD
  • 数字签名使用: RSA/ECDSA/DSA
  • 密钥交换使用: RSA/ECDH/DH
  • 对称加密使用: AES/CHACHA20/RC4c
# 使用命令查看 openssl 支持的加密组合方式
openssl ciphers -v | column -t

2.2.4 自建 HTTPS Server

  • 生成 RSA 密钥,并使用该密钥对证书签名
#生成 RSA 密钥对
openssl genrsa -out key.pem 2048
#生成证书
openssl req -new -x509 -key key.pem -out cert.pem -days 1095

#查看 RSA 密钥对
openssl rsa -in key.pem -text -noout
#查看证书
openssl x509 -in cert.pem -text -noout
  • 将证书应用于 HTTPS Server
  • 访问 https 网址(提示证书有问题)
  • 导入证书到系统,再次访问
  • 查看 Google/Baidu 的证书

2.3 X.509 证书标准

主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

编码格式

同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式.
PEM - Privacy Enhanced Mail,打开看文本格式,以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码. 查看PEM格式证书的信息:
openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.
DER - Distinguished Encoding Rules,打开看是二进制格式,不可读. 查看DER格式证书的信息:
openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.

相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫"PEM"或者"DER",常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.
CRT - CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码。
CER - 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.
KEY - 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法: openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der
CSR - Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧.
查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)
PFX/P12 - predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个"提取密码",你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
这个时候会提示你输入提取代码. for-iis.pem就是可读的文本. 生成pfx的命令类似这样:
openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx -certfile CACert.crt
其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.
JKS - 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫"keytool"的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

没有评论:

发表评论