1. 简介
1.1 密码算法作用
- 机密性:敏感信息不泄露给未经授权的实体。
- 完整性:保证信息在储存和传输过程中不被修改。如使用hash函数校验。
- 真是性:可以确定远程用户或系统的身份。
- 不可抵赖性:证明一个唯一的用户进行了交易请求。用户是不可能对他或她的行为进行否认的。
1.2 常用密码算法
- 对称加密算法
- 非对称加密算法
- 哈希算法
2. 随机数
密码算法中的密钥、密钥材料、盐值、IV的生成都使用到随机数,应使用密码学安全的随机数发生器来产生。
可以使用哪些安全的随机数发生器?
如果产品支持使用硬件随机数接口则尽量使用硬件接口来产生随机数,如果不支持,可使用以下安全的随机数发生器或接口:
OpenSSL库的RAND_bytes( );
中软iPSI组件的CRYPT_random( );
JDK的java.security.SecureRandom( );
类Unix平台的/dev/random文件;
Windows平台的RtlGenRandom( );
VxWorks平台CCI组件的cciRand( )函数。
使用RAND_bytes()和CRYPT_random()前要在程序初始化时分别调用RAND_seed()和CRYPT_randSeed()设置随机数种子。可使用系统时间或程序运行时间(毫秒为单位)作为种子。
注意:C标准库函数random( )、rand( )以及Java的java.util.Random类,所产生的随机数都不属于安全随机数,禁止用于安全用途。
3. 对称加密算法
对称加密算法用来对敏感数据等信息进行加密。
加密密钥和解密密钥是一样的或者彼此之间容易相互确定。
- 分组密码算法:将明文分成固定长度的分组,如64bit或128bit一组,用同一密钥和算法对每一个分组加密,输出也是固定长度的密文。
- 流密码算法:将明文按字符逐位(逐比特)地、对应地进行加密的一类对称密码算法。
最佳实践:
使用对称分组密码算法进行加密时,推荐使用AES算法(Advanced Encryption Standard)。
(所有的流密码算法都存在结构上的弱点)
要点: 正确生成密钥、密码算法工作模式的选取(分组密码算法时选择GCM或CBC模式)、IV生成(安全随机数)。
4. 非对称加密算法
又称公钥密码算法。其使用两个密钥,一个公钥,一个私钥。公钥可以向所有使用者公开,私钥需要保密。
非对称密码算法广泛应用于密钥协商、数字签名、数字证书等安全领域。
4.1 RSA算法
RSA算法是第一个既能用于数据非对称加密也能用于数字签名的算法。应用:
- 密钥对生成:产生公钥和私钥
- 非对称加密:采用公钥加密私钥解密
- 数字签名:私钥对消息摘要加密,公钥验签
最佳实践:
非对称加密,选择RSA算法时,其密钥长度应为2048bits。
RSA算法进行非对称加密时,优先选择OAEP填充方式。
4.2 数字签名
作用:数据完整性、身份认证、抗抵赖。
- 数字签名的流程
签名:
- 信息的发送方使用哈希函数(如SHA-256)对信息生成信息摘要;
- 信息的发送方使用自己的私钥对摘要值进行非对称加密(签名);
- 信息发送方将信息和加密后的摘要值封装成签名结果,发送给接收方。
验签:
- 接收方首先利用发送方的公钥解密数字签名,导出摘要值;
- 接收方使用同样的哈希函数对信息重新计算摘要值;
- 将(步骤1)解密出的摘要值和(步骤2)计算得到的摘要值进行比较,如果相同,则签名得到验证,否则签名无效。
最佳实践:
数字签名算法选择,推荐使用RSA(2048bits)或者ECDSA(256bits)签名算法。
签名算法要结合安全的哈希算法一起使用。
只对来源可信的数据进行签名。
在同时进行加密和签名时,使用先签名后加密的方式。
5. 哈希算法
哈希算法也叫消息摘要算法、单向散列、数字指纹算法。对任意给定的数据生成一个定长的摘要。
在密码学中,哈希算法常用于构造MAC或在数字签名方案中用于提取数字指纹,也常用于输入比较、软件完整性保护、密钥导出、口令保存、随机数生成。
常用的安全哈希算法:SHA-256、SHA-384、SHA-512.
不安全的哈希算法:MD2、MD4、MD5、SHA-1.
常见误用1:口令使用可还原的方式储存,攻击者可能获取口令仿冒用户身份登录。
口令是指用于身份认证、鉴权或者导出加密密钥的字符串,可由字母、数字和符号组成。口令不是密钥(key)。
对于不需要还原口令的场景必须保存口令的单向哈希值。
常见误用2:口令使用了哈希算法,但没有加盐,不能抵抗彩虹表攻击。
彩虹表:就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合。
盐值:通过在口令任意位置插入字符串,让哈希后的结果和使用原始口令的哈希结果不相符,这种过程称之为“加盐”。这个字符串就是盐值。
最佳实践:口令单向哈希场景下推荐使用PBKDF2算法。
单纯的口令哈希值,无法防止彩虹表攻击。哈希加盐可以防止彩虹表攻击,但无法防止暴力攻击,安全性仍不足,标准的基于口令密钥导出算法考虑了彩虹表攻击和暴力攻击的防范,更为安全。
PBKDF2算法是一个密钥导出算法,既可用于导出密钥,也可用于口令保存,计算公式:
DK = PBKDF2(Password, Salt, count, dkLen)。
要点:哈希算法推荐使用SHA256及以上、迭代次数最低10000次、盐值至少为8字节安全随机数、输出长度不少于256比特。