简明指南
这篇文章不涉及密码学的数学原理,只提及相关概念和应用
概念
-
古典密码 基于字符的替换或移项,或者两者混合使用。
-
现代密码 使用计算机技术的,在比特和字节上操作。
-
明文 = 在密码学中是指传送方想要接收方获得的可读信息
-
密文 = 经过加密的明文
-
加密 = 把明文转换为密文的过程
-
解密 = 把密文转换为明文的过程
-
密钥 = 指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息
-
密码 约等于 密钥
-
Hash = 哈希,又被翻译为 离散
- 按照不同的语境,可以理解为的 哈希值(hash value) 或 哈希函数(hash function)
- 哈希值就是指一段信息经过哈希函数处理后输出的值
- 哈希函数无法逆向演算回原本的数值
- 对于大多数情况下,哈希值不一样,原本的值也不一样
- md5 和 sha-1 都存在哈希冲突的情况,就是哈希值一样但原本的值不一样
- 这是一些常见的哈希函数
- md5
- sha-1
- sha-256
- sha-512
-
数字摘要 = 一段信息的哈希值,一般情况下是指明文的哈希值
-
MD = 消息摘要 (Message Digest) ,就是数字摘要
-
MAC = 消息 验证码 (Message Authentication Code) ,就是明文 + 密钥 + MAC 算法生成的一段数据,这里的密钥一般是对称加密的密钥,MAC 算法有很多种,但最常用的是 hash 算法,就是明文加上密钥的数字摘要
-
HMAC = 使用 hash 算法的 MAC
-
Nonce 是 Number used once 或 Number once 的缩写,数字使用一次,在密码学中 Nonce 是一个只被使用一次的任意或非重复的随机数值
-
时间戳 timestamp 表示的是从世界标准时间(UTC,Coordinated Universal Time)的 1970 年 1 月 1 日 0 时 0 分 0 秒开始到现在的秒数,时间戳大部分情况下是 10 位的,但有时也会用 13 位的时间戳
-
块加密 又称为 分块加密 或 分组加密 ,是将明文分成多个等长的模块(block),使用确定的算法和对称密钥对每组分别加密解密。块加密通常有三个参数,算法 密码强度 模式,例如 aes-256-gcm , aes 是对称加密的算法, 256 是密码强度, gcm 是分组密码的工作模式,通常只有块加密的算法有工作模式的参数。DES 和 AES 都是块加密
-
流加密 加密和解密双方使用相同伪随机加密数据流(pseudo-randomstream)作为密钥,明文数据每次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。RSA 是流加密
-
对称加密 = 加密和解密都用同一个密钥。
-
非对称加密 = 加密和解密使用不同的密钥。
- 公开的密钥用于加密和验证签名,称为公钥;不公开的密钥用于解密和签名,称为私钥
- 一般是一对密钥,加密用其中一个密钥,那么解密就要用另一个密钥。一般两个密钥的长度是不一样的,一般长度较短的密钥会公开,称为公钥 ,长度较长的密钥不会公开,称为私钥 (这个其实只适用于 RSA ,其它非对称加密算法不是这样的)
-
公开密钥密码学 (Public-key cryptography) 就是 非对称加密
-
公钥 = 在非对称加密中,可以公开的密钥
-
私钥 = 在非对称加密中,不能公开的密钥
-
数字签名 = 在非对称加密中,由私钥和签名算法生成的信息。在 RSA 中数字签名是由私钥加密后的数字摘要,但其它非对称加密算法不是这样的。
-
密钥密文 一般是指,对称加密和非对称加密组合使用下,使用公钥 加密 对称加密的密钥
-
数字信封 一般是指,对称加密和非对称加密组合使用下,内容是 密钥密文 + 密文 (使用对称加密的密文) 的信息。数字信封既发挥了对称加密算法速度快的优点,又发挥了非对称加密算法密钥管理方便的优点。
-
CKE = 内容密钥 (Contents Encrypting Key) ,就是用于加密明文的密钥,是和 KEK 相对的
-
KEK = 加密密钥的密钥 (Key Encrypting Key)
-
PBE = 基于口令的密钥 (Password Based Encryption,PBE) ,在 PGP 里会用 PBE 加密私钥
-
盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。在大部分情况,盐是不需要保密的。盐可以是随机产生的字符串,其插入的位置可以也是随意而定。
-
数字证书 = 用户信息(csr) + 用户公钥 + 公钥指纹 + 其它相关信息 + (颁发 机构私钥 加密 前面提及的 相关数据的 数字摘要 所得到的数字签名)
-
https 里的 ssl 证书就是数字证书
-
这是数字证书的一般格式
证书版本号序列号 由证书颁发者分配的本证书的唯一标识符。颁发者和证书序列号配合起来就能唯一地标识一张数字证书。签名算法颁发者国家(C,Country)州/省(S,State)地域/城市(L,Location)组织/单位(O,Organization)通用名称(CN,Common Name)证书有效期此日期前无效此日期后无效主题国家(C,Country)州/省(S,State)地域/城市(L,Location)组织/单位(O,Organization)通用名称(CN,Common Name) 在 TLS 应用上,此字段一般是域名主题公钥信息公钥算法主题公钥颁发者唯一身份信息(可选项 AKID , authority key identifier ) 颁发者公钥的数字摘要主题唯一身份信息(可选项 SKID , subject key identifier ) 主题公钥的数字摘要扩展信息(可选项)主题别名(Subject Alternative Name) 在 TLS 应用上,如果一个证书需要支持多个域名,则其它域名会填在这里授权密钥标 识符 颁发者的公钥...证书签名算法数字签名
-
-
PKC = 公钥证书 (Public-Key Certificate,PKC) ,就是数字证书
-
公钥指纹 = 公钥的数字摘要,是用于标识较长公共密钥字节的短序列。由于指纹较比生成它们的密钥短得多,因此可以用来简化某些密钥的管理任务。
-
颁发证书 = CA 用私钥加密 CSR 和 用户公钥然后生成数字证书的过程
-
csr 是 cerificate signing request 的英文缩写,即证书请求文件,内容是 公钥 + 用户信息(例如 域名之类的),一般是向 CA 申请数字证书用的。 X.509 证书申请的格式标准为 PKCS10 和 rfc2314 。 cerificate 证书 signing 签署 request 请求
-
CA = 数字证书认证 (Certificate Authority)
-
CA 中心 = 数字证书认证机构,一般情况下 CA 和 CA 中心 都是指 数字证书认证机构
-
CA 系统 = 用于颁发数字证书的系统,由 CA 中心管理和运营
-
CAA = 数字证书认证授权 (Certificate Authority Authorization) , CAA 是一种 DNS 记录,它允许站点所有者指定允许哪些证书颁发机构(CA)颁发包含其域名的证书。
-
crt 和 cert 都是 certificate 的缩写
-
最终实体证书 = 普通用户向 CA 申请后使用的证书
-
自签证书 = 用户信息(csr) + 用户公钥 + 私钥加密前面两个数据所得到的数字签名(用户私钥)
-
证书链是从 终端用户证书后跟着一系列的 CA 证书,而通常最后一个是自签名证书,并且有如下关系:
- 在证书链上除最后一个证书外,证书颁发者等于其后一个证书的主题。
- 除了最后一个证书,每个证书都是由其后的一个证书签名的。
- 最后的证书是信任主题,由于是通过可信过程得到的,所以可以信任。
-
根证书 = 证书链里最后一个证书,一般是自签证书,一般是 CA 的自签证书,根证书一般是直接内置在客户端(内置在浏览器或操作系统里)的
-
中间证书 = 一个 CA 向另一个 CA 颁发的证书,又或者说证书链中处于中间位置的证书,一个证书链里可以有多个中间证书
-
在线证书状态协议(英语:Online Certificate Status Protocol,缩写:OCSP)是一个用于获取 X.509 数字证书撤销状态的网际协议,在RFC 6960中定义,作为证书吊销列表(CRL)的替代品解
-
证书吊销列表(英文:Certificate revocation list,缩写:CRL,或译作证书废止清册)是尚未到期就被证书颁发机构吊销的数字证书的名单。这些在证书吊销列表中的证书不再会受到信任。目前,在线证书状态协议(OCSP)已经替代证书吊销列表(CRL)成为检查证书状态的主流。
-
证书链的验证
- 从证书里获取颁发者信息 -> 从仓库里获取颁发者的公钥 -> 公钥验证数字证书的数字签名
- 重复这个过程一直到根证书为止
- 这个过程中还会查询 CRL 和 OCSP ,确认证书没有过期。还可能会验证密钥用法,证书策略等属性
-
PKI = 公开密钥基础设施 (Public Key Infrastructure) , PKI 包含 PKIX 和 PKCS
- PKI 的 核心是数字证书的发行,一般来说,构成 PKI 的主要要素就是下面三个概念
- 数字证书
- 认证机关 (CA)
- 证书库
- PKI 的 核心是数字证书的发行,一般来说,构成 PKI 的主要要素就是下面三个概念
-
PKCS = 公钥密码学标准 (The Public-Key Cryptography Standards)
- 是由美国 RSA 数据安全公司及其合作伙伴制定的一组公钥密码学标准,其中包括证书申请、证书更新、证书作废表发布、扩展证书内容以及数字签名、数字信封的格式等方面的一系列相关协议。
-
X.509 = PKIX
-
PKIX = 公钥基础设施 X.509 (Public Key Infrastructure X.509) ,X.509 是密码学里公钥证书的格式标准,证书组成结构标准用 ASN.1 来进行描述
-
X.509 是密码学里公钥证书的格式标准, PKCS 是一系列密码学的标准, PKCS 有十几个标准, X.509 大致相当于 PKCS1 和 PKCS12
-
PKCS #12 定义了一种存档文件格式,用于实现存储许多加密对象在一个单独的文件中。通常用它来打包一个私钥及有关的 X.509 证书,或者打包信任链的全部项目。一个 PKCS #12 文件通常是被加密的,同时单独存在(存档文件格式)。
- 可以打包密钥对和数字证书
-
PFX = PKCS#12 ,其实也不算是严格相等,但大多数语境下可以相等
-
PKCS 比较常用的是 1 7 8 10 12
-
ASN.1 抽象语法符号 (Abstract Syntax Notation One,ASN.1)
- ASN.1 是一种用来定义数据结构的接口描述语言
- ASN.1 有一套关联的编码规则,这些编码规则用来规定如何用二进制来表示数据结构, DER 是其中一种
-
DER = 可辨别编码规则 (Distinguished Encoding Rules) ,是一种二进制的用于保 存证书和密钥的文件编码格式, windows 和 java 是用这种格式的
-
PEM = 私密 增强 邮件 (Privacy Enhanced Mail) ,是一种纯文本的用于保存证书和密钥的文件编码格式,而 DER 编码的内容是二进制的,不适合与邮件传输(早期 email 不能发送附件), nginx apahce php 是用这种格式的
-
JKS = Java Key Storage, JAVA 的专属格式,利用 JAVA 的一个叫 keytool 的工具可以进行格式转换。一般用于 Tomcat 服务器。
-
PKCS 和 X.509 是格式标准,而 DER 和 PEM 是文件编码格式
-
CA/浏览器论坛 (CA/Browser Forum) ,是一个证书颁发机构、网页浏览器软件供应商、操作系统,以及其他采用PKI的应用程序的自愿联合体,其颁布X.509 v.3电子证书的签发与管理的行业治理方针,在诸多应用程序中链接到信任锚。其方针涵盖用于SSL/TLS协议和代码签名的证书,以及系统和证书颁发机构的系统和网络安全。
-
会话密钥,加密会话内容的密钥,大多数情况下只用一次。
-
主密钥,会被重复使用的,加密会话密钥的密钥。
-
PSK = 预共享密钥 (pre-shared key)
-
常用的算法
- 对称加密
- des
- 3des
- aes
- 非对称加密
- RSA
- ElGamal
- ECDSA
- 数字摘要
- sha2
- md5
- 对称加密
-
密码套件 (cipher suite) 或者称为密码包,是 https 中各种算法的集合,一般包括 密钥交换算法 身份验证算法 加密算法(加密方法-加密强度-模式) 哈希算法 。一般情况下密码包里的算法不能重复出 现,例如 密钥交换算法用了 RSA ,那么身份验证算法就不能用 RSA
-
PR = 伪随机数 (Pseudo Random) ,计算机里生成真正的随机数其实挺麻烦的,所以一般都是用伪随机数
-
PRF = 伪随机数函数 (Pseudo Random Function) ,就是用于生成伪随机数的方法
-
PRNG = 伪随机数生成器 (Pseudo Random Number Generator) ,就是用于生成伪随机数的方法
-
TRNG = 真随机数生成器 (True Random Number Generator)
-
HRNG = 硬件随机数生成器 (Hardware Random Number Generator) ,大部分语境下 HRNG == TRNG ,单靠软件无法生成真随机数
-
CSPRNG = 密码学安全伪随机数生成器 (Cryptographically secure pseudo-random number generator)
-
TTP 可信赖的第三者 (Trusted third party) ,在 PKI 里通常是指 CA
-
OTP 一次性密码本 (one-time pad)
-
HTTPS = HTTP + TLS 或 HTTP + TLS , HTTP + SSL 已经被弃用,现在的都是 HTTP + TLS ,有些时候也会称为 HTTP + TLS/SSL
-
WSS = WebSocket + TLS/SSL
-
SSL = 安全套接层 (Secure Sockets Layer) ,网景公司(Netscape)在 1994 年推出首版网页浏览器-网景导航者时,推出 HTTPS 协议,以 SSL 进行加密
-
TLS = 传输层安全性协议 (Transport Layer Security) , IETF 将 SSL 标准化,并将其称为 TLS , 1999 年公布 TLS 1.0 标准文件(RFC 2246)。其实大多数 TCP 的协议都可以在上面套一层 TLS
-
除了 HTTP 之外 TSL/TLS 可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet)搭配使用
-
TLS 服务器证书,就是启用 HTTPS 时需要用到的数字证书,也称为 SSL 证书,一般是从 CA 申请后部署在 HTTP 服务器的
-
一般语境下的 SSL 证书,就是 Common Name 是域名的数字证书
- SSL 证书按照域名的数量可以分为
- 单域名证书
- 多域名证书 除了 Common Name 是域名之外,其它域名都填在 扩展信息(可选项)里的主题别名(Subject Alternative Name)
- 通配符证书 Common Name 的域名最后一级是通配符 * ,但只能匹配一级的域名
- SSL 证书按照审核的内容可以分为
- 域名验证证书 (Domain Validation Certificate DV) ,验证域名的所有权,通常是免费的,颁发速度很快,十分钟左右就能完成颁发
- 组织验证证书 (Organization Validation Certificate OV) ,验证域名所有权,也要验证企业或组织身份, 因为 CA 会验证企业或组织的身份,一般需要几天才完成颁发
- 扩展验证证书 (Extended Validation Certificate EV) ,除了验证域名所有权, CA 验证企业或组织身份之外,还会引入第三方审核,可能牵涉专业法律人员的调查及独立审计人员
- SSL 证书按照域名的数量可以分为
-
S/MIME ,安全的多用途 Internet 邮件扩展(Secure Multipurpose Internet Mail Extensions,简称S/MIME)是一种 Internet 标准,它在安全方面对 MIME 协议进行了扩展,可以将 MIME 实体(比如数字签名和加密信息等)封装成安全对象,为电子邮件应用增添了消息真实性、完整性和保密性服务。 S/MIME 不局限于电子邮件,也可以被其他支持 MIME 的传输机制使用,如 HTTP
-
证书颁发机构浏览器论坛,也称 CA/浏览器论坛(英语: CA/Browser Forum 缩写: CA/B)、证书机构与浏览器论坛,它是一个证书颁发机构、网页浏览器软件供应商、操作系统,以及其他采用 PKI 的应用程序的自愿联合体,其颁布 X.509 v.3 电子证书的签发与管理的行业治理方针,在诸多应用程序中链接到信任锚。其方针涵盖用于 SSL/TLS 协议和代码签名的证书,以及系统和证书颁发机构的系统和网络安全。
-
证书透明度(英语:Certificate Transparency,简称CT)也称证书透明、证书透明化,它是一个实验性的IETF开源标准和开源框架,目的是监测和审计数字证书。通过证书日志、监控和审计系统,证书透明度使网站用户和域名持有者可以识别不当或恶意签发的证书,以及识别数字证书认证机构(CA)的作为。
-
向前保密,前向安全性或前向保密性(英语:Forward Secrecy,缩写:FS),有时也被称为完美前向安全(英语:Perfect Forward Secrecy,缩写:PFS),是密码学中通讯协议的安全属性,指的是长期使用的主密钥泄漏不会导致过去的会话密钥泄漏。
-
零知识证明(Zero Knowledge Proof),是这样的一个过程,证明者在不向验证者提供任何额外信息的前提下,使验证者相信某个论断(Statement)是正确的。证明过程包括交互式(Interactive)和非交互式(Non-interactive)两种。
-
各类编码的转换,例如 base64 和 urlencode ,这类编码的转换虽然可以把一般的字符串转换成一堆看上去是乱码的字符串,但实质上并没有加密的功能,只是增加了普通人的阅读障碍。有些时候也可以用这类方式来规避一些内容的审查
-
数字指纹 主要用于版权保护,其研究具有重要的意义。数字指纹是将不同的标志性识别代码——指纹,利用数字水印技术嵌入到数字媒体中,然后将嵌入了指纹的数字媒体分发给用户。发行商发现盗版行为后,就能通过提取盗版产品中的指纹,确定非法复制的来源,对盗版者进行起诉,从而 起到版权保护的作用。
-
e2ee 端到端加密 (End-to-end encryption) 是一种只有参与通讯的用户可以读取信息的通信系统。总的来说,它可以防止潜在的窃听者——包括电信供应商、互联网服务供应商,获取能够用以解密通讯的密钥。此类系统被设计为可以防止潜在的监视或篡改企图,因为没有密钥的第三方难以破译系统中传输或储存的数据。
-
SSH = Secure Shell
- Secure Shell Protocol (rcf 4251) 由 IETF 的网络小组所制定,专为远程登录会话和其他网络服务提供安全性的协议。
- OpenSSH 是 SSH 的开源实现,多数语境下 SSH 指的是 OpenSSH 里的 ssh 命令
- SSH 只是加密的 shell ,最初是用来替代 telnet 的。通过 port forward ,也可以让其他协议通过 SSH 的隧道而起到加密效果。
- SSH 和 TLS 是两种不一样的协议,但都能为其它协议提供加密效果
- 一般用 SSH 的,会称为 xxx over SSH , 会把 s 加在前面,例如 sftp (ftp over SSH)
- 一般用 TLS 的,会称为 xxx over TLS , 会把 s 加在后面,例如 ftps (ftp over TLS)
- SSH 能代理 UDP
- TLS 是建立在 TCP 上的,要代理 UDP 会有一点困难
-
DoH 和 DoT
- DNS over HTTPS 基于 HTTPS 的 DNS
- DNS over TSL 基于 TLS 的 DNS
- DoH 的安全原理与 DoT 一样,他们之间的区别只在于:DoH 有了 HTTP 格式封装,更加通用。
-
DNSSEC = 域名系统安全扩展(DNS Security Extensions),简称DNSSEC。通过数字签名来保证 DNS 应答报文的真实性和完整性,能够防止 DNS 欺骗和缓存污染等攻击。