不可逆算法(哈希HASH)
哈希算法
哈希算法:将一段(通常是较大的)数据映射为较短小的数据。这段小数据就是大数据的哈希值,它是唯一的,一旦大数据发生变化,他的哈希值也会发生变化。
哈希碰撞
哈希碰撞是指,两个不同的输入得到了相同的输出:
"AaAaAa".hashCode(); // 0x7460e8c0
"BBAaBB".hashCode(); // 0x7460e8c0
碰撞能不能避免,哈希算法的输出长度越长,碰撞概率越小。
算法 | 输出长度(位) | 输出长度(字节) |
---|---|---|
MD5 | 128 bits | 16 bytes |
SHA-1 | 160 bits | 20 bytes |
RipeMD-160 | 160 bits | 20 bytes |
SHA-256 | 256 bits | 32 bytes |
SHA-512 | 512 bits | 64 bytes |
应用:
- 用于密码管理 - 把用户的密码以MD5值(或类似的其它算法)的方式保存起来,用户注册的时候,系统是把用户输入的密码计算成 MD5 值,然后再去和系统中保存的 MD5 值进行比较,如果密文相同,就可以认定密码是正确的,否则密码错误。通过这样的步骤,系统在并不知道用户密码明码的情况下就可以确定用户登录系统的合法性。如果数据库泄漏,黑客也无法拿到用户的原始口令,如果黑客有一个预先计算好的常用口令和它们的MD5的对照表(彩虹表),就能反查到原始口令,我们可以采取措施来抵御,方法是对每个口令额外添加随机数,这个方法称之为加盐。
- 电子签名 - 使用 MD5算法就可以为任何文件(不管其大小、格式、数量)产生一个独一无二的
数字指纹
,借助这个数字指纹
,通过检查文件前后 MD5 值是否发生了改变,就可以知道源文件是否被改动。
基于密钥的哈希算法
HMAC:类似“加盐”的MD5,Hmac本质上就是把安全key混入摘要的算法。
可逆算法
对称加密
加密:明文 -> 密钥加密 -> 密文。
解密:密文 -> 密钥解密 -> 明文。
经典加密算法有三种 :
- DES(Data Encryption Standard):数据加密标准(现在用的比较少,因为它的加密强度不够,能够暴力破解)
- 3DES:原理和DES几乎是一样的,只是使用3个密钥,对相同的数据执行三次加密,增强加密强度。(缺点:要维护3个密钥,大大增加了维护成本)
- AES(Advanced Encryption Standard):高级加密标准,目前美国国家安全局使用的,苹果的钥匙串访问采用的就AES加密。是现在公认的最安全的加密方式,是对称密钥加密中最流行的算法。
加密模式 :
- ECB模式(默认):电码本模式 Electronic Codebook Book,就是每个块都是独立加密
- CBC模式:密码分组链接模式 Cipher Block Chaining,使用一个密钥和一个初始化向量(IV)对数据执行加密转换
- CTR模式:计算器模式 Counter
- CFB模式:密码反馈模式 Cipher FeedBack
- OFB模式:输出反馈模式 Output FeedBack
加密模式是加密过程对独立数据块的处理。对于较长的明文进行加密需要进行分块加密,在实际开发中,推荐使用CBC的,ECB的要少用。
非对称加密RSA
发送公钥 -> 对方用公钥加密 -> 收到密文、私钥解密
常见的非对称加密算法有:RSA、DSA(美国国家标准局提出)、ECC(椭圆曲线密码学)、DH等。
ECC 算法比 RSA、DSA 速度更快,基于 ECC 的签名算法主要有两种:ECDSA 与 EdDSA, EdDSA 比 ECDSA 更简洁更快一点,因此现在通常更推荐使用 EdDSA 算法。目前 EdDSA 有两个方案:Ed25519 和 Ed448。