简明指南
这篇文章不涉及密码学的数学原理,只提及相关概念和应用
概念
古典密码 基于字符的替换或移项,或者两者混合使用。
现代密码 使用计算机技术的,在比特和字节上操作。
明文 = 在密码学中是指传送方想要接收方获得的可读信息
密文 = 经过加密的明文
加密 = 把明文转换为密文的过程
解密 = 把密文转换为明文的过程
密钥 = 指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息
密码 约等于 密钥
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 欺骗和缓存污染等攻击。
信息安全
信息安全五要素
- 信息的保密性(Confidenciality)、真实性(Authenticity)、完整性(Integrity)、不可否认性(Non-repudiation)、可用性(Availability)
- 其中保密性(Confidenciality)、完整性(Integrity)、可用性(Availability)称为 CIA 三要素
- 这些要素是原子的,不能进一步分解或重合,代表信息安全的一个方面。任何信息安全漏洞都可以描述为影响这些要素一个或多个
- CIA 三要素之间存在互相牵制的关系,过度强化保密性时,将造成完整性与可用性的降低,需要高可用性的系统则会造成机密性与完整性的降低,因此在有限资源的前提下,在 CIA 三要素中获取适当的平衡是信息安全管理层次结构的重要课题。
各个密码学概念对应的要素
- 数字摘要 -> 完整性
- 消息认证码 -> 完整性 真实性
- 数字签名 -> 完整性 真实性 不可否认性
- 加密 -> 保密性
各种攻击所对应的要素
- 完整性 -> 篡改
- 真实性 -> 伪装
- 保密性 -> 窃听
- 可用性 -> 阻断
以 https 为例解释信息安全的五要素
- https 的连接过程
- tcp 三次握手建立连接
- 客户端和服务器协商密码包
- 服务器发送证书给客户端,客户端验证证书,这里会验证证书的数字签名,有效时间,颁发者等信息,还会逐级验证证书链上的证书(证书链的验证会查询 OCSP 和 CRL )
- 客户端生成一个对称加密的密钥
- 客户端把对称加密的密钥发送给服务端;密钥交换协议有好多种,其中最容易理解的就是 RSA 了,客户端公钥加密 对称加密的密钥,然后服务器用私钥解密
- 客户端和服务器在后续的通讯都使用对称加密
- 数字证书和证书链是保证信息源的真实性
- 数字证书中的数字签名是保证数字证书的完整性,真实性,不可否认性
- https 完成握手后的通讯使用对称加密是保证消息的保密性
- 对称加密的通讯会在消息的末尾加上 MAC 校验数据,保证消息的完整性,真实性
- 但这些都不能保证可用性,以下是针对可用性的攻击例子
- 拒绝服务攻击
- 旁观者攻击
信息安全常识
- 不要使用保密的密码算法
- 使用低强度的密码比不进行任何加密更危险
- 低强度的密码和没有加密同样不安全。但是使用了密码会给用户一种错误的安全感,导致用户容易泄露一些机密的信息。
- 任何密码总有一天都会被破解
- 密码只是信息安全的一部分
3A
- 认证(Authentication)
- 识别信息用户的身份,可记录信息被谁所访问使用,例如:透过密码或证书方式验证用户身份。 实务做法:
- 你所知道的(Something you know):账号/密码
- 你所拥有的(Something you have):IC卡、数字设备、数字签名、一次性密码(OTP)
- 你所具备的(Something you are):指纹、虹膜、声纹、脸部特征、静脉脉纹、DNA
- 识别信息用户的身份,可记录信息被谁所访问使用,例如:透过密码或证书方式验证用户身份。 实务做法:
- 授权(Authorization)
- 依照实际需求给予实体适当的权限,一般建议采最小权限(Least privilege),意即仅给予实际作业所需要的权限,避免过度授权可能造成的信息暴露或泄漏。 信息系统层面的实务访问控制方法分类如下:
- 强制访问控制(Mandatory Access Control)
- 自由选定访问控制(Discretionary Access Control)
- 以角色为基础的访问控制(Role-Based Access Control)
- 以规则为基础的访问控制(Rule-Based Access Control)
- 依照实际需求给予实体适当的权限,一般建议采最小权限(Least privilege),意即仅给予实际作业所需要的权限,避免过度授权可能造成的信息暴露或泄漏。 信息系统层面的实务访问控制方法分类如下:
- 记录(Accounting)
- 内容项目包含量测(Measuring)、监控(Monitoring)、报告(Reporting)与日志案(Logging), 以便提供未来作为审核(Auditing)、计费(Billing)、分析(Analysis)与管理之用, 主要精神在于收集用户与系统之间交互的资料,并留下轨迹纪录。
信息安全的基本原则
为了达到信息安全的目标,各种信息安全技术的使用必须遵守一些基本的原则。
- 最小化原则。
- 受保护的敏感信息只能在一定范围内被共享,履行工作职责和职能的安全主体,在法律和相关安全策略允许的前提下,为满足工作需要。仅被授予其访问信息的适当权限,称为最小化原则。敏感信息的“知情权”一定要加以限制,是在“满足工作需要”前提下的一种限制性开放。
- 可以将最小化原则细分为知所必须(need to know)和用所必须(need to use)的原则。
- 分权制衡原则。
- 在信息系统中,对所有权限应该进行适当地划分,使每个授权主体只能拥有其中的一部分权限,使他们之间相互制约、相互监督,共同保证信息系统的安全。
- 如果一个授权主体分配的权限过大,无人监督和制约,就隐含了“滥用权力”、“一言九鼎”的安全隐患。
- 安全隔离原则。
- 隔离和控制是实现信息安全的基本方法,而隔离是进行控制的基础。信息安全的一个基本策略就是将信息的主体与客体分离,按照一定的安全策略,在可控和安全的前提下实施主体对客体的访问。
- 在这些基本原则的基础上,人们在生产实践过程中还总结出的一些实施原则,他们是基本原则的具体体现和扩展。
- 包括:整体保护原则、谁主管谁负责原则、适度保护的等级化原则、分域保护原则、动态保护原则、多级保护原则、深度保护原则和信息流向原则等。
随机数
随机数的性质
- 随机性,不存在统计学偏差,是完全杂乱的数列
- 不可预测性,不能从过去的数列推测出下一个出现的数列
- 不可重现性,除非将数列本身保存下来,否则不能重现相同的数列
随机数的分类
- 随机数
- 伪随机数
- 统计学伪随机数(弱伪随机数) - 满足 随机性
- 密码学伪随机数(强伪随机数) - 满足 随机性 不可预测性
- 真随机数 - 满足 随机性 不可预测性 不可重现性
- 伪随机数
随机数的作用
- 生成密钥
- 用于对称密码和消息认证码
- 生成公钥密码
- 用于生成公钥密码和数字签名
- 生成初始化向量 IV
- 用于分组密码中的 CBC、CFB、OFB 模式
- 生成 nonce
- 用于防御重放攻击和分组密码中的 CTR 模式
- 生成盐
- 用于基于口令密码的 PBE 等
- 用随机数的目的是为了提高密文的不可预测性
在 linux 下生成随机数
/dev/random 在类 UNIX 系统中是一个特殊的设备文件,可以用作随机数生成器。
/dev/random 的随机数的提供是依赖与外部中断事件的,如果没有足够多中断事件,就会阻塞。 /dev/random 生成的是真随机数。
/dev/urandom(“unblocked”,非阻塞的随机数生成器)是 /dev/random 的一个副本 ,它会重复使用熵池中的数据以产生伪随机数据。 这表示对 /dev/urandom 的读取操作不会产生阻塞,但其输出的熵可能小于 /dev/random 的。 它可以作为生成较低强度密码的伪随机数生成器,不建议用于生成高强度长期密码。
/dev/random 和 /dev/urandom 会输出二进制数据流,可以用 od 命令转换,或者用 base64 命令转换。
/dev/random 和 /dev/urandom 生成的都是符合密码学安全的随机数。因为 /dev/random 可能会阻塞,所以大部分情况下用 /dev/urandom 就可以了。
大部分情况下都是用 TRNG 生成的随机数作为种子,然后再用 CSPRNG 生成密码学安全的随机数。这样既能保证安全也能效率也不会太低。
命令行下的使用示例
# 不能直接用 cat ,因为 /dev/random 会一直输出
head -n 1 /dev/random | od -x
head -n 1 /dev/urandom | od -x
# 生成随机字符串
head -n 1 /dev/urandom | base64 | head -n 1
head -n 1 /dev/urandom | base64 | head -n 1
# 只生成数字
head -n 1 /dev/urandom | base64 | head -n 1 | tr -dc '0-9'
# 环境变量里的 $RANDOM 是一个随机数字
echo $RANDOM