【基础入门-11】算法解密&散列对称非对称&字典碰撞&前后端逆向&MD5&AES&DES&RSA

分析流程

密文 – 有源码直接看源码分析算法(后端必须要有源码才能彻底知道)

密文 – 没有源码 1、看特征猜识别 2、看前端JS(加密逻辑是不是在前端)


加密解密-类型

单向散列加密 – MD5

常见的单向散列加密算法有:MD5 SHA MAC CRC

单向散列加密算法的优点(以MD5为例):方便存储,损耗低:加密/加密对于性能的损耗微乎其微。

单向散列加密算法的缺点:存在暴力破解的可能性,最好通过加盐值的方式提高安全性,此外可能存在散列冲突。MD5加密也是可以破解的。

解密条件:密文即可,采用碰撞解密,几率看明文复杂程度

对称加密 – AES

常见的对称加密算法有:DES AES RC4

对称加密优点:算法公开、计算量小、加密速度快、加密效率高。

对称加密缺点:发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担。

解密条件:密文、密钥和偏移量(以及加密模式,固定几种可依次尝试),采用逆向算法解密,条件成立即可解密成功

非对称加密 – RSA

常见的非对称加密算法:RSA RSA2 PKCS

非对称加密的优点:与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可进行相互的加解密。

非对称加密的缺点:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。

解密条件:密文和公钥或私钥,采用逆向算法解密,条件成立即可解密成功

公钥加密 -> 私钥解密 ;私钥加密 -> 公钥解密

组合加密、多重加密

MD5+salt再次MD5……


加密解密-识别特征

MD5密文特点:

  • 由数字“0-9”和字母“a-f”所组成的字符串
  • 固定的位数 16 和 32位

解密需求:密文即可,但复杂明文可能解不出

BASE64编码特点:

  • 大小写区分,通过数字和字母的组合
  • 一般情况下密文尾部都会有两个等号,明文很少的时候则没有
  • 明文越长密文越长,一般不会出现”/””+”在密文中

AES、DES密文特点:

  • 同BASE64基本类似,但一般会出现**”/”和”+”**在密文中

解密需求:密文,模式,加密Key,偏移量,条件满足才可解出

RSA密文特点:

  • 特征同AES,DES相似,但是长度较长

解密需求:密文,公钥或私钥即可解出

其他密文特点:


加解密逻辑

后端:MD5+Salt

对应代码段:

$password = md5(md5($password).$salt);

代码加密逻辑:原始 password -> MD5 -> 第一次 MD5 结果 -> +salt -> 再次 MD5 -> 最终password

解密:

//基础解密逻辑
<?PHP
$h = 'd7192407bb4bfc83d28f374b6812fbcd';  //密文
$hash=md5(md5('123456').'3946d5');  //123456替换为一个字典文件批量尝试解密,3946d5为salt
if($h==$hash){
	echo 'ok';  //对比碰撞解密成功
}else{
	echo 'no';
}
?>
    
//加入字典文件进行碰撞解密
<?php
function reverse_md5_hash_with_salt($final_hash, $salt, $dictionary_file) {
    // 打开字典文件
    $file = fopen($dictionary_file, "r");
    if (!$file) {
        die("无法打开字典文件!");
    }
    // 遍历字典文件中的每一行(即每一个密码)
    while (($password = fgets($file)) !== false) {
        // 去除密码两侧的空白字符(包括换行符)
        $password = trim($password);
        // 第一次 MD5 加密密码
        $md5_hash = md5($password);
        // 拼接 md5($password) 和 salt
        $salted_hash = $md5_hash . $salt;
        // 第二次 MD5 加密
        $final_attempt = md5($salted_hash);
        // 检查是否匹配
        if ($final_attempt === $final_hash) {
            fclose($file);
            return $password;  // 找到匹配的密码
        }
    }
    // 如果没有找到匹配的密码
    fclose($file);
    return null;
}
// 给定的目标加密值和盐值
$final_hash = "125648dbf16531ab7e6b2f8ec8003ea7";  // 目标 MD5 值
$salt = "3e3790";  // 盐值
// 字典文件路径
$dictionary_file = "weaksauce.txt";  // 字典文件路径
// 调用函数进行密码破解
$password = reverse_md5_hash_with_salt($final_hash, $salt, $dictionary_file);
// 输出结果
if ($password) {
    echo "破解成功,密码是: $password";
} else {
    echo "密码破解失败";
}
?>

后端:哈希+Salt

对应代码段:

	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);  //核心加密逻辑,PHP自带的内置函数,对应验证函数password_verify()
	}

代码加密逻辑:用户原始密码 -> password_hash() -> 选择哈希算法 $algo -> 自动生成随机 salt -> 结合密码 + salt 进行密码哈希 -> 得到 $hash

解密:

<?PHP
$hash = '$2y$10$KA.7VYVheqod8F3X65tWjO3ZXfozNA2fC4oIZoDSu/TbfgKmiw7xO';
if (password_verify('123456', $hash)) {  //password_verify是PHP自带的内置函数
    echo 'ok';
} else {
    echo 'error';
}
?>

<?PHP
$hash = '$2y$10$PDACNCRyZzcsknF8zvL4yu7YHIPQTN8F635PxQeXSB8QxxDZSXrd.';
$dictionary_file = "weaksauce.txt";
$file = fopen($dictionary_file, "r");
    if (!$file) {
        die("无法打开字典文件!");
    }
    // 遍历字典文件中的每一行(即每一个密码)
    while (($password = fgets($file)) !== false) {
        // 去除密码两侧的空白字符(包括换行符)
        $password = trim($password);
        echo $password."<br>"; 
        if (password_verify($password, $hash)) {
            echo 'ok';
        } else {
            echo 'error';
        } 
    }
?>

前端JS:加密JS文件调用MD5

注意前端对应js文件需要加载才能使用

解密:把对应加密文件(md5.js)扣下来,本地写解密程序

<script src="script/md5.js" type="text/javascript"></script>
$("#btnPost").click(function(){
    var strPassWord=$("#edtPassWord").val();
    $("form").attr("action","cmd.php?act=verify");
    $("#password").val(MD5(strPassWord));
console.log(MD5("123456"));

前端JS:混合加密

<script src="/Scripts/Vip/Login.js?v=20241202154949"></script>
function Login() {
	logindata.UserName = encodeURI(encrypt.encrypt(numMobile));
	logindata.Mobile = encodeURI(encrypt.encrypt(numMobile));;
	logindata.Password = encodeURI(encrypt.encrypt(numPassword));
}
var encrypt = new JSEncrypt();
encodeURI(encrypt.encrypt('13554365566'));

代码逻辑:用户输入手机号/密码 -> encrypt.encrypt() -> RSA 公钥加密 -> 得到 Base64 密文 -> encodeURI() -> 放入 HTTP 请求参数 -> 发送服务器 -> 服务器使用 RSA 私钥解密


密文解密

明确以下三种加密算法加解密条件

对称AES/DES加解密,非对称RSA加解密

解密:http://tool.chacuo.net/cryptdes


应用场景:

  • 发送数据的时候自动将数据加密发送(只需加密即可) 安全测试思路:我们需要将我们的Payload也要加密发送过去,这样才符合正常的业务逻辑,所以我们就只需要调用应用的JS加密逻辑进行提交发送测试即可!
  • 比如要得到数据的明文(必须要拿到解密算法) 由于各种算法的解密条件不一,密钥,偏移量,私钥等不一定能拿到。
  • 对于后续安全测试影响较大的: 1、目标:API接口 前后端分离应用居多 2、漏洞发现:未授权 各类漏洞测试 爆破等 3、其他

本节知识点&思维导图

算法类型-单向散列&对称性&非对称性

算法识别加解密-MD5&AES&DES&RSA

解密条件寻找-逻辑特征&源码中&JS分析

十二亿七千光年
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇