Day09:基础入门-算法逆向散列对称非对称JS源码逆向AESDESRSASHA

目录

算法加密-概念&分类&类型

加密解密-识别特征&解密条件

解密实例-密文存储&数据传输

思维导图


章节知识点:

应用架构:Web/APP/云应用/三方服务/负载均衡等

安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等

渗透命令:文件上传下载/端口服务/Shell反弹等

抓包技术:HTTP/TCP/UDP/ICMP/DNS/封包/代理等

算法加密:数据编码/密码算法/密码保护/反编译/加壳等

安全测试中:

  • 密文-有源码直接看源码分析算法(后端必须要有源码才能彻底知道)
  • 密文-没有源码1、猜识别 2、看前端JS(加密逻辑是不是在前端)

算法加密-概念&分类&类型

单向散列加密 -MD5

单向散列加密算法的优点有(以MD5为例):
方便存储,损耗低:加密/加密对于性能的损耗微乎其微。
单向散列加密的缺点就是存在暴力破解的可能性,最好通过加盐值的方式提高安全性,此外可能存在散列冲突。我们都知道MD5加密也是可以破解的。
常见的单向散列加密算法有:MD5 SHA MAC CRC

对称加密 -AES

对称加密优点是算法公开、计算量小、加密速度快、加密效率高。
缺点是发送方和接收方必须商定好密钥,然后使双方都能保存好密钥,密钥管理成为双方的负担。常见的对称加密算法有:DES AES RC4

非对称加密 -RSA

非对称加密的优点是与对称加密相比,安全性更好,加解密需要不同的密钥,公钥和私钥都可进行相互的加解密。缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。常见的非对称加密算法:RSA RSA2 PKCS

加密解密-识别特征&解密条件

md5密文特点

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

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

Base64编码特点

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

AES,DES密文特点

同BASE64基本类似,但一般会出现"/“和”+"在密文中
解密需求:密文,模式,加密Key,偏移量,条件满足才可解出

RSA密文特点

特征同AES,DES相似,但是长度较长
解密需求:密文,公钥或私钥即可解出

如果明文是用公钥加密就只能用私钥解,明文是用私钥加密就只能用共钥解

解密实例-密文存储&数据传输

1.密码存储,后端处理

1.查找源代码

2.通过源代码进行数值代入

3.写简单程序或者利用平台解码

源代码如下:

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';
}
?>

脚本编写思路

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';
}
?>

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);
}

<?PHP
$hash = '$2y$10$KA.7VYVheqod8F3X65tWjO3ZXfozNA2fC4oIZoDSu/TbfgKmiw7xO';
if (password_verify('123456', $hash)) {
echo 'ok';
} else {
echo 'error';
}
?>

2.数据通讯

博客登录-ZBlog(前端处理)

<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));

btnPost=%E7%99%BB%E5%BD%95&username=admin&password=e10adc3949ba59abbe56e057f20f883e&savedate=1

墨者靶场-后端处理

解密的逻辑:base64解码两次再解密

正向sql注入加密

解密过程

1.获取密文

2.查看源码

3.进行反编译,得到数据

4.用注入语言按照密文加密顺序加密

5.获得用户名与数据库名称

3.test.php php加解密 php版本7.3

<?php

//aes
namespace vendor;
 
class EncryptionTool{
 
    public static function enAES($originTxt, $key): string{
 
        return base64_encode(openssl_encrypt($originTxt, 'AES-128-ECB',$key, OPENSSL_RAW_DATA));
    }
 
    public static function deAES($originTxt, $key): string{
 
        $data = base64_decode($originTxt);
        return openssl_decrypt($data,'AES-128-ECB',$key, OPENSSL_RAW_DATA);
    }
    
}

//des
class DES
{
    /**
     * @var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得
     */
    protected $method;
    /**
     * @var string $key 加解密的密钥
     */
    protected $key;
    /**
     * @var string $output 输出格式 无、base64、hex
     */
    protected $output;
    /**
     * @var string $iv 加解密的向量
     */
    protected $iv;
    /**
     * @var string $options
     */
    protected $options;
    // output 的类型
    const OUTPUT_NULL = '';
    const OUTPUT_BASE64 = 'base64';
    const OUTPUT_HEX = 'hex';
    /**
     * DES constructor.
     * @param string $key
     * @param string $method
     *      ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可)
     *      CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
     *      CFB DES-CFB8、DES-EDE3-CFB8
     *      CTR
     *      OFB
     *
     * @param string $output
     *      base64、hex
     *
     * @param string $iv
     * @param int $options
     */
    public function __construct($key, $method = 'DES-ECB', $output = '', $iv = '', $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)
    {
        $this->key = $key;
        $this->method = $method;
        $this->output = $output;
        $this->iv = $iv;
        $this->options = $options;
    }
    /**
     * 加密
     *
     * @param $str
     * @return string
     */
    public function encrypt($str)
    {
        $str = $this->pkcsPadding($str, 8);
        $sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv);
        if ($this->output == self::OUTPUT_BASE64) {
            $sign = base64_encode($sign);
        } else if ($this->output == self::OUTPUT_HEX) {
            $sign = bin2hex($sign);
        }
        return $sign;
    }
    /**
     * 解密
     *
     * @param $encrypted
     * @return string
     */
    public function decrypt($encrypted)
    {
        if ($this->output == self::OUTPUT_BASE64) {
            $encrypted = base64_decode($encrypted);
        } else if ($this->output == self::OUTPUT_HEX) {
            $encrypted = hex2bin($encrypted);
        }
        $sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv);
        $sign = $this->unPkcsPadding($sign);
        $sign = rtrim($sign);
        return $sign;
    }
    /**
     * 填充
     *
     * @param $str
     * @param $blocksize
     * @return string
     */
    private function pkcsPadding($str, $blocksize)
    {
        $pad = $blocksize - (strlen($str) % $blocksize);
        return $str . str_repeat(chr($pad), $pad);
    }
    /**
     * 去填充
     * 
     * @param $str
     * @return string
     */
    private function unPkcsPadding($str)
    {
        $pad = ord($str{strlen($str) - 1});
        if ($pad > strlen($str)) {
            return false;
        }
        return substr($str, 0, -1 * $pad);
    }
}

//rsa
define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm
8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY
inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1
poLBwrol0F4USc+owwIDAQAB
-----END PUBLIC KEY-----');

define('RSA_PRIVATE','-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h
BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk
haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk
HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk
93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0
fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm
BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv
MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4
HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll
9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h
z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg
jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO
LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o
pCcWaTO3GgC5Kg==
-----END PRIVATE KEY-----');

$password='xiaodisec';

//md5
echo "原始数据:$password". "<br/>";
echo "MD5加密后:".md5($password). "<hr/>";

//base64
echo "原始数据:$password". "<br/>";
echo "BASE64编码后:".base64_encode($password). "<hr/>";

//aes
echo "原始数据: " . $password . "<br/>";
$data = EncryptionTool::enAES($password, "1234567891234567");
echo "AES加密后: " . $data . "<hr/>";
//echo "解密后: " . EncryptionTool::deAES($data, "1234567891234567") . "<br/>";

//des
echo "原始数据:$password". "<br/>";
$key = 'key123456';
$iv = 'iv123456';
// DES CBC 加解密
echo 'DES CBC 加解密:';
$des = new DES($key, 'DES-CBC', DES::OUTPUT_BASE64, $iv);
echo $base64Sign = $des->encrypt($password);
echo "<br>";
//echo $des->decrypt($base64Sign);
echo "<hr>";
// DES ECB 加解密
echo "原始数据:$password". "<br/>";
echo 'DES ECB 加解密:';
$des = new DES($key, 'DES-ECB', DES::OUTPUT_BASE64);
echo $base64Sign = $des->encrypt($password);
echo "<hr>";
//echo $des->decrypt($base64Sign);

//rsa
//公钥加密 
$public_key = openssl_pkey_get_public(RSA_PUBLIC); 
if(!$public_key){
    die('公钥不可用');
}
//第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
$return_en = openssl_public_encrypt($password, $crypted, $public_key);
if(!$return_en){
    return('加密失败,请检查RSA秘钥');
}
$eb64_cry = base64_encode($crypted);
echo "RSA公钥加密数据:".$eb64_cry;
echo "<br>";

//私钥解密
$private_key = openssl_pkey_get_private(RSA_PRIVATE);
if(!$private_key){
    die('私钥不可用');
}
$return_de = openssl_private_decrypt(base64_decode($eb64_cry), $decrypted, $private_key);
if(!$return_de){
    return('解密失败,请检查RSA秘钥');
}
echo "RSA私钥解密数据:".$decrypted;
echo "<hr>";

//私钥加密
$private_key = openssl_pkey_get_private(RSA_PRIVATE);
if(!$private_key){
    die('私钥不可用');
}
$return_en = openssl_private_encrypt($password, $crypted, $private_key);
if(!$return_en){
    return('加密失败,请检查RSA秘钥');
}
$eb64_cry = base64_encode($crypted);
echo "RSA私钥加密数据".$eb64_cry;
echo "<br>";

//公钥解密
$public_key = openssl_pkey_get_public(RSA_PUBLIC);
if(!$public_key){
    die('公钥不可用');
}
$return_de = openssl_public_decrypt(base64_decode($eb64_cry), $decrypted, $public_key);
if(!$return_de){
    return('解密失败,请检查RSA秘钥');
}
echo "RSA公钥解密数据:".$decrypted;
echo "<hr>";

?>

思维导图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/431700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(二)数据库系统的结构抽象与演变

待补充 2.1三层模式与两层映像&#xff0c;物理独立性和逻辑独立性 从数据角度可以分为三层视图模式默认指的是全局模式&#xff0c;视图默认指的是外部视图 一个数据库只有一个内模式 DBMS要让用户定义三层模式&#xff0c;程序自动地实现两层映像 。 2.2数据→模式→数据模型…

C#程序模块的封装

文章目录 一、简单认识程序模块的封装1.1什么情况下使用封装&#xff1f;1.2 具体的例子 二、实际当中的程序封装的应用DLL的主要特点和用途&#xff1a;如何在C#中创建和使用DLL&#xff1a; 一、简单认识程序模块的封装 在C#中&#xff0c;程序模块的封装&#xff08;Encaps…

数据结构中红黑树的概念以及代码

红黑树&#xff08;Red-Black Tree&#xff09;是一种自平衡的二叉搜索树&#xff0c;它在插入和删除节点时通过一系列的旋转和重新着色操作来保持平衡。红黑树的平衡性质使得它的查找、插入和删除操作的时间复杂度都能保持在 O(log n) 红黑树的定义如下&#xff1a; 每个节点要…

qt cmake添加resource文件

文章目录 方式一:方式二:qrc的使用 两种方式 方式一: 创建一个qrc文件&#xff0c;在qt_add_executable 中直接添加 qt_add_executable(helloworldmain.cppimageresources.qrc )方式二: 使用 qt_add_resources qt_add_resources(helloworld "app_images"PREFIX &…

dolphinscheduler海豚调度(四)钉钉告警

在之前的博文中&#xff0c;我们已经介绍了DolphinScheduler海豚调度的基本概念和工作流程&#xff0c;以及Shell任务和SQL任务的实践。今天&#xff0c;让我们来学习DolphinScheduler中的另一个重要功能&#xff1a;钉钉告警。 钉钉群添加机器人 在钉钉群添加机器人&#xf…

三国野史秘闻翻译视频剪辑 条条爆品 一条视频增粉1w (附888G素材内容)

我将为大家分享一个全新的主题——三国野史秘闻。这个主题本身就充满了趣味性&#xff0c;再加上我们独特的解读&#xff0c;由于粉丝们对此类内容非常热衷&#xff0c;因此很容易在评论区引发热烈讨论&#xff0c;这使得我们的短视频有很大的机会在抖音上走红。 项目 地 址 &…

基于springboot的学生网上请假系统设计与实现论文

学生网上请假系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生网上请假系统的开发全过程。通过分析学生网上请假系统管理的不足&#xff0c;创建了一个计算机管理学生网上请假系统的方案。文章介绍了学…

React富文本编辑器开发(六)

现在&#xff0c;相关的基础知识我们应该有个大概的了解了&#xff0c;但离我们真正的开发出一个实用型的组件还有一段距离&#xff0c;不过不用担心&#xff0c;我们离目标已经越来越近。 以现在我们所了解的内容而言&#xff0c;或许你发现了一个问题&#xff0c;就是我们的编…

ICASSP2024 | ICMC-ASR 车载多通道语音识别挑战赛总结

为促进驾驶场景中语音处理和识别研究&#xff0c;在ISCSLP 2022上成功举办智能驾驶座舱语音识别挑战 (ICSRC)的基础上&#xff0c;西工大音频语音与语言处理研究组 (ASLPNPU)联合理想汽车、希尔贝壳、WeNet社区、字节、微软、天津大学、南洋理工大学以及中国信息通信研究院等多…

splay学习笔记重制版

以前写的学习笔记&#xff1a;传送门 但是之前写的比较杂乱&#xff0c;这里重制一下 问题背景 假设我们要维护一个数据结构&#xff0c;支持插入、删除、查询某个值的排名&#xff0c;查询第 k k k大的值等操作。 最直接的想法是用二叉搜索树&#xff0c;也就是左子树权值&l…

Tomcat实现java博客项目、状态页及常见配置介绍

目录 一、自建博客 1. 项目背景 2. 操作示例 二、状态页 1. 概述 2. server status 信息状态页 3. manager app 项目管理状态页 4. host manger 虚拟主机管理状态页 三、常见配置 1. 端口8005/tcp安全配置管理 2. tomcat端口号 3. 虚拟主机设置 4. Context配置 一…

2024年第一届CS2major,新胶囊即将发行,需要提前做哪些布局

2024年第一届CS2major&#xff0c;将会在3月17日哥本哈根开始。 所以&#xff1a; 1、新的胶囊大概率会在3月10日左右发布。 2、网传战队挂坠&#xff0c;不知道是否会出现&#xff1f;&#xff08;原本出现过战队布章包&#xff0c;由于销量太差&#xff0c;第二届就取消了…

【Qt】Qwidget的常见属性

目录 一、Qwidget核心属性 二、enable属性 三、geometry属性 四、 WindowFrame的影响 五、windowTitle属性 六、windowIcon属性 七、qrc文件管理资源 八、windowOpacity属性 九、cursor属性 十、font属性 十一、toolTip属性 十二、focusPolicy属性 十三、styleShe…

Mysql面试总结

基础 1. 数据库的三范式是什么&#xff1f; 第一范式&#xff1a;强调的是列的原子性&#xff0c;即数据库表的每一列都是不可分割的原子数据项。第二范式&#xff1a;要求实体的属性完全依赖于主关键字。所谓完全 依赖是指不能存在仅依赖主关键字一部分的属性。第三范式&…

redis09 集群(cluster)

思维草图 为什么要使用集群 单台redis内存容量的限制单台redis并发写量太大有性能瓶颈 redis集群认识 redis集群是对redis的水平扩容&#xff0c;即启动N个redis节点&#xff0c;将整个数据分布存储在这个N个节点中&#xff0c;每个节点存储总数据的1/N。 如下图&#xff1…

LVS负载均衡集群+NAT部署

一. LVS集群相关知识 1. 集群和分布式 系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 升级单机的硬件设备 Scale Out&#xff1a;水平扩展&#xff0c;向外扩展,增加设备&#xff0c;并行…

光影交织:汽车穿越隧道的视觉盛宴

在繁忙的城市中&#xff0c;隧道成为了连接两端的重要通道。而对于汽车来说&#xff0c;穿越隧道不仅是一次简单的空间转移&#xff0c;更是一场融合了视觉、技术与安全的独特体验。 当汽车缓缓驶入隧道&#xff0c;外界的光线逐渐减弱&#xff0c;隧道内部的光线开始发挥作用。…

c++中多种类型sort()排序的用法(数组、结构体、pair、vector)

c中多种类型sort排序的用法 一、对数组排序1、默认排序2、自定义排序 二、对结构体进行排序三、对pair进行排序1、默认排序2、自定义排序 四、对vector进行排序1、默认排序2、去重排序3、自定义排序 一、对数组排序 1、默认排序 默认从小到大进行排序 #include <bits/std…

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题?

如何解决幻兽帕鲁/Palworld服务器联机游戏时的丢包问题&#xff1f; 等待服务器维护&#xff1a;首先&#xff0c;确保网络连接稳定&#xff0c;然后查看游戏官方或社区论坛&#xff0c;了解是否有服务器维护的消息。这是解决丢包问题的一种直接且有效的方法。 更新显卡驱动&a…

讲讲地理人,可能没有想过的就业方向!建议收藏

先说下大家比较熟悉的就业去向&#xff0c;也是绝大多是人会优先考虑并规划的就业方向。 1、考编制&#xff0c;去初、高中做地理老师。这是师范类高校或女生主要的就业方向&#xff0c;一般都是重点高中&#xff0c;待遇、社会地位都还不错。 2、去大专院校或本科院校做老师、…