写在开始:
密文—有源码直接看源码分析加密算法(如果是在后端加密必须有源码才能测地知道)
密文—没有源码的话,1. 靠经验去猜根据密文特征去识别;2. 看前端JS(是否成功取决于加密逻辑是不是在前端)
一、算法加密-概念&分类&类型
- 单向散列加密–MD5
- 优点:方便存储,损耗低:加密/解密对于性能的损耗微乎其微(因为没有密钥等附加条件)
- 缺点:
- 存在被暴力破解的可能性,最好通过加盐值(MD5(MD5+salt))的方式提高安全性;
- 可能存在散列冲突
- 常见的单向散列加密算法有:MD5、SHA、MAC、CRC
- 密文特点
- 由数字"0-9"和字母"a-f"所组成的字符串
- 固定位数16位或32位
- 解密要求:
- 知道密文即可
- 但是复杂明文可能破解不出来
- 使用的是碰撞解密
- 对称加密–AES
- 优点:算法公开,计算量小,加密速度快、加密效率高
- 缺点:发送方和接收方必须商定好密钥,然后使双发都能保存好密钥,密钥管理称为双方的负担
- 常见的对称加密算法有:DES、AES、RC4
- AES BES密文特点
- 同BASE64基本雷士,但一般会出现"/“和”+"在密文中
- 解密需求:密文、模式、加密key(密钥),偏移量(ECB模式没有偏移量),只有条件满足才可解出
- 使用的是算法逆向
- 非对称加密–RSA
- 优点:与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可进行相互的加解密
- 缺点:加密和解密花费时间长,速度慢,只适合对少量数据进行加密。
- 常见非对称加密算法:RSA、RSA2、PKCS
- 密文特点
- 特征:同AES,DES相似,但是长度较长;且同样明文多次加密的密文不一致,但长度会限制在一定范围内
- 解密需求:密文,公钥或私钥其中一个即可解出
- BASE64编码特点:
- 大小写区分,通过数字和字母的组合
- 一般情况下密文尾部会出现两个等号,明文长度小的时候则没有
- 明文越长密文越长,一般不会出现"/“和”+"在密文中
二、加密解密-识别特征&解密条件
- MD5加密
使用**.md5**函数
- BASE64编码
使用**.base64_encode**函数
- AES
- KEY:传参过去的1234567891234567(加解密最关键的信息)
- Cipher mode(加密模式):AES-128-ECB,就是ECB模式,ECB模式是没有偏移量(iv)的
- DES(加密模式为CBC模式与ECB模式)
- key : key123456
- iv :iv123456
- 加密模式:CBC、ECB
- RSA
- 如果使用公钥加密,则需要使用私钥解密;如果使用私钥加密,则使用公钥解密
三、解密实例-密文存储&数据传输
- 单向散列(后端处理)
- MD5
X3.2 —>MD5&salt
加密代码:
DZ对应代码段-/uc_server/model/user.php
function add_user() {
$password = md5(md5($password).$salt);
}
解密脚本–>单向散列只能通过字典碰撞的方式去碰运气破解密码
<?PHP
$h = 'd7192407bb4bfc83d28f374b6812fbcd';
$hash=md5(md5('123456').'3946d5');
if($h==$hash){
echo 'ok';
}else{
echo 'no';
}
?>
- PHP自带:password_hash() 函数用于创建密码的散列(hash)
X3.5-hash
DZ对应代码段-/uc_server/model/user.php
function add_user() {
$salt = '';
$password = $this->generate_password($password);
}
function generate_password($password) {
$algo = $this->get_passwordalgo();
$options = $this->get_passwordoptions();
$hash = password_hash ($password, $algo, $options);
}
解密脚本:通过password_verify函数去碰撞密文
<?PHP
$hash = '$2y$10$KA.7VYVheqod8F3X65tWjO3ZXfozNA2fC4oIZoDSu/TbfgKmiw7xO';
if (password_verify('123456', $hash)) {
echo 'ok';
} else {
echo 'error';
}
?>
- 单向散列(前端JS加密)
- ZBLOG