这是百度百科的定义:
PBE算法在加密过程中并不是直接使用口令来加密,而是加密的密钥由口令生成,这个功能由PBE算法中的KDF函数完成。KDF函数的实现过程为:将用户输入的口令首先通过“盐”(salt)的扰乱产生准密钥,再将准密钥经过散列函数多次迭代后生成最终加密密钥,密钥生成后,PBE算法再选用对称加密算法(如AES)对数据进行加密。
salt的作用是预防字典攻击。试想,如果没有salt,攻击者可以事先构造一个口令到key的字典,然后遍历字典里的候选key,这样就能大幅缩短尝试时间。但如果加了salt,准备候选key就变得非常困难,因为攻击者事先并不知道salt是啥,那他要准备的候选key的数量就会变得非常巨大。所以,salt应该要存放在一个安全的地方。
将准密钥经过散列函数多次迭代后生成最终加密密钥,这个过程称之为stretching。多次迭代的目的是为了加大攻击者破解的成本,对用户来说,准密钥就那一个,多次执行散列算法开销并不大。但对于攻击者而言,他是要用大量的候选key进行尝试的,再叠加多次散列算法执行,那就是一个很大的负担。当然,最终加密密钥也要放到一个安全的地方。
一个用python3写的PBE算法的例子:
from Crypto.Cipher import AES
from Crypto.Random.random import StrongRandom
from Crypto.Util.number import long_to_bytes
from Crypto.Hash import SHA256
def get_secure_random(byte_num) -> bytes:
sr = StrongRandom()
v = long_to_bytes(sr.getrandbits(byte_num * 8))
l = len(v)
if l