目錄
算法加密-概念&分類&類型
加密解密-識別特征&解密條件
解密實例-密文存儲&數據傳輸
思維導圖
章節知識點:
應用架構: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.phpfunction 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>";?>