欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php對稱加密和解密的實(shí)現(xiàn)詳解

 更新時(shí)間:2023年11月09日 07:33:44   作者:極客小俊  
加密是為了信息傳遞更加安全,這樣才能更好的讓信息傳遞更具有保密性,不會(huì)被他人隨意篡改,本文為大家介紹了php實(shí)現(xiàn)簡單的對稱加密和解密過程,希望對大家有所幫助

為什么我們要加密

加密是為了信息傳遞更加安全!

這樣才能更好的讓信息傳遞更具有保密性,不會(huì)被他人隨意篡改、也能夠讓信息真實(shí)有效的到達(dá)指定對象的手里!

我們加密的目的,多數(shù)是圍繞這上面這些情況來的!

舉個(gè)栗子

在信息通信過程當(dāng)中,比如你發(fā)送一條重要信息給對方, 在這個(gè)過程中其實(shí)有很多人可以利用一些技術(shù)手段接觸到這一段信息! 如果是很重要的信息但個(gè)別人利用,說不一定就會(huì)產(chǎn)生嚴(yán)重的經(jīng)濟(jì)損失!

例如: 信息中包含了一些敏感信息,如身份證、銀行卡、密碼、而這些敏感信息是最容易被人偷窺的!

如圖

為了避免出現(xiàn)以上的情況,我們就要將信息進(jìn)行加密處理, 這樣子即便是被人拿到了關(guān)鍵信息,他也是在短時(shí)間內(nèi)無法查看的,也就是讓任何第三方都無法直接讀取和讀懂的信息!

只有發(fā)送方和接收方能看懂整個(gè)數(shù)據(jù)傳輸?shù)男畔ⅰ?/p>

加密系統(tǒng)的簡單架構(gòu)

加密的產(chǎn)生過程,簡單點(diǎn)說其實(shí)就是: 明文+密鑰+算法=密文

如圖

從上面的圖來看,其實(shí)明文和算法都還是比較好理解,但其中有一個(gè)叫密鑰的東西,它就好比是像彼此約定好了的暗號一樣, 也是最簡單的加密方式!

舉個(gè)栗子

從生活中我們用一個(gè)鎖家里的門來舉例的話,就是家中有價(jià)值的物品,就是你的明文、那么密鑰就是你的鑰匙,那么算法就是你是通過什么樣的情況來鎖門的! 當(dāng)門鎖好之后,那么一個(gè)家就形成了一個(gè)加密狀態(tài)了!

所以這個(gè)密鑰通常都是需要保密的,就是這個(gè)意思,你總不可能把你的鑰匙隨便丟吧!

對稱加密

那么在計(jì)算機(jī)中,我們也一些有比較安全和常見的加密方式, 例如:對稱加密

對稱加密其實(shí)分為兩種形式: 對稱加密和非對稱加密

簡單的說對稱加密也就是加密和解密都會(huì)使用同樣密鑰

非對稱加密則恰恰相反,這種加密和解密使用的是不同密鑰

AES對稱加密算法

AES全稱:advanced encryption standard 它是密碼學(xué)中的高級加密標(biāo)準(zhǔn),也是美國聯(lián)邦政府采用的區(qū)塊加密的標(biāo)準(zhǔn),也是當(dāng)下比較流行的對稱密碼算法!

我們前面提到的對稱加密中就包含了AES 也就是加密和解密都會(huì)使用同樣密鑰的加密算法

簡單的說發(fā)送方將明文和密鑰一起經(jīng)過特殊加密算法處理后,使其變成復(fù)雜的加密密文再發(fā)送出去!

接收方如果想解讀明文, 那么需要使用加密用過的密鑰及相同算法然后按照與加密時(shí)相反的順序逆推算法對密文進(jìn)行解密,才能使其恢復(fù)成可讀的明文信息!

前面說了,在對稱AES加密算法中,使用的密鑰只有一個(gè), 發(fā)送方和接收方都使用這個(gè)密鑰對數(shù)據(jù)進(jìn)行加密和解密,那么這就要求解密的一方事先必須知道加密密鑰對吧!

如圖

這就像是它要求發(fā)送方和接收方在通信之前,約定一個(gè)密鑰(暗號)

對稱算法的安全性依賴于密鑰,如果泄漏密鑰就意味著任何人都可以對他們發(fā)送或接收的數(shù)據(jù)進(jìn)行解密

所以密鑰的保密性對AES通信的安全性至關(guān)重要!

對稱加密算法的優(yōu)點(diǎn)在于加密和解密的快速和使用長密鑰時(shí)的難破解性,而這種加密算法支持長度為 128比特的密鑰長度, 同時(shí)也支持192、256比特一共三種選擇!

我們知道加密的核心在于密鑰而算法本身其實(shí)最終都會(huì)被破解的,所以現(xiàn)在流行的密碼算法都是公開的,所以從密碼學(xué)的角度而言也沒有人去保密算法來提高安全性,所以說對于現(xiàn)在某些密碼攻擊手段對于一些高級加密標(biāo)準(zhǔn)算法本身并沒有效果,真正核心的還是密鑰, 這里密鑰的長度直接就會(huì)影響到蠻力攻擊要取得成功需要耗費(fèi)相當(dāng)長的時(shí)間,而這種對稱加密算法的安全性取決于密鑰的保存情況來決定!

所以普通情況下,沒有特殊需求,基本上首先的是AES加密

應(yīng)用場景

這里我簡單說一個(gè)案例

假設(shè)我們現(xiàn)在有一個(gè)包含用戶個(gè)人信息的JSON對象,需要進(jìn)行加密處理

如下

{  
  "name": "張三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "13812345678"  
}

那么此時(shí)我們可以使用一些加密算法,比如:AES、RSA 對這個(gè)JSON對象中的一些數(shù)據(jù)進(jìn)行加密處理。

然后加密之后的數(shù)據(jù)會(huì)變成一串密文,用戶是無法直接閱讀和理解。

例如:使用AES算法加密上述JSON對象,結(jié)果可能類似于以下形式:

{  
  "name": "張三",  
  "age": 30,  
  "email": "zhangsan@example.com",  
  "phone": "tv/yxsWlDIPHOnD50WVnFw=="  
}

現(xiàn)在可以看到,加密后的JSON對象中的phone電話字段已經(jīng)被替換為一串看似隨機(jī)的字符串,我們是無法直接讀取原始的手機(jī)號的, 這樣也對整個(gè)JSON對象也變得難以理解和解析。

這里加密后的JSON數(shù)據(jù)需要解密后才能還原為原始數(shù)據(jù),而解密過程與加密相反,

需要使用相應(yīng)的解密算法和密鑰來還原數(shù)據(jù)。

PHP實(shí)現(xiàn)AES對稱加密

我們來實(shí)現(xiàn)一個(gè)簡單的加密案例,有興趣的朋友可以來看看,java、php、python等等用什么語言都可以!

我用php中的OpenSSl擴(kuò)展庫來實(shí)現(xiàn)AES對稱加密與解密

不用我們?nèi)チ私獾讓?,只需要輕松幾步就可以實(shí)現(xiàn)一個(gè)簡單加密和解密數(shù)據(jù)的過程!

代碼如下

<?php  
  
function encryptAES($data, $key, $iv) {    
    $encrypted = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    $encrypted = base64_encode($encrypted);  
    return $encrypted;  
}  
  
function decryptAES($encryptedData, $key, $iv) {  
    $encryptedData = base64_decode($encryptedData);  
    $decrypted = openssl_decrypt($encryptedData, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);  
    return $decrypted;  
}  
  
// 加密數(shù)據(jù)  
$data = 'Hello-World!';  
$key = '0123456789abcdef';
$iv = '1234567890abcdef';
  
$encryptedData = encryptAES($data, $key, $iv);  
echo '加密后的數(shù)據(jù):' . $encryptedData;  

echo '<hr>';

// 解密數(shù)據(jù)  
$decryptedData = decryptAES($encryptedData, $key, $iv);  
echo '解密后的數(shù)據(jù):' . $decryptedData;  
  
?>

效果如下

代碼分析

這里簡單的使用到了phpOpenSSl擴(kuò)展庫openssl_encryptopenssl_decrypt函數(shù)來實(shí)現(xiàn)的AES

openssl_encrypt函數(shù)解釋

如下表

參數(shù)列表含義
參數(shù)1:data待加密的明文信息數(shù)據(jù), 也就是需要加密的數(shù)據(jù),你可以把它想象成你想要鎖起來的秘密信息
參數(shù)2:method加密方式, 也就是你想要用來加密數(shù)據(jù)的加密算法, 常見的加密算法包括 AES, 具體可以查看官方文檔 例如: 你使用 AES-256-CBC 算法,那么 CBC 表示加密模式,256 表示密鑰的長度
參數(shù)3:key約定加密和解密的一把鑰匙, 而這把密鑰的長度必須與所選擇的加密算法相匹配.........例如,如果使用 AES-256-xxx,那么你的密鑰應(yīng)該是 256 位長! 所以我們最好要給定相應(yīng)字節(jié)長度的字符串密鑰,雖然有時(shí)候我們沒有定義指定長度的字符的密鑰,但仍然能夠成功加密數(shù)據(jù),是因?yàn)镻HP的OpenSSL擴(kuò)展自動(dòng)處理了密鑰的填充和生成! 但是為了確保最佳的安全性,最好顯式地指定一個(gè)符合長度要求的密鑰! 這樣可以避免任何潛在的填充問題,并確保密鑰的長度與所選加密算法的要求相匹配, 比如說: 在 AES-256 算法中,密鑰的長度為 32 字節(jié)(256 位)的字符串就可以了! 這里我采用的是AES,而AES密鑰的長度通??梢允?28位、192位、256位
參數(shù)4:options它可以控制如何處理返回的數(shù)據(jù), 它有兩種常量設(shè)置方式: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING 例如,你可以設(shè)置 OPENSSL_RAW_DATA 常量選項(xiàng),這樣函數(shù)會(huì)返回原始的二進(jìn)制數(shù)據(jù),一把也都設(shè)置這個(gè)!
參數(shù)5:iv它是一個(gè)初始化向量, 用于增加加密的安全性和隨機(jī)性! 這里所謂的初始化向量其實(shí)就是一個(gè)隨機(jī)字符串,但是這個(gè)隨機(jī)字符串是有一定講究的,它的字符長度通常需要與加密模式的要求相匹配, 也就是說不同的加密模式可能會(huì)有不同的iv要求, 例如: 當(dāng)我們使用AES-256-CBC加密模式時(shí),iv參數(shù)應(yīng)該至少為16字節(jié)長度的隨機(jī)字符串, 如果使用AES-128-CBC加密模式時(shí), iv參數(shù)必須為16字節(jié)長度的隨機(jī)字符串,多一個(gè)或少一個(gè)都會(huì)報(bào)錯(cuò)! 所以iv這個(gè)參數(shù),最好是要和加密模式中的長度一致就行了! 為了更加安全,這個(gè)iv最好不能寫死,用一種算法方式生成指定長度的iv 這樣子在每次加密操作時(shí)都會(huì)改變加密結(jié)果!
....................................

返回值:成功時(shí)返回加密后的字符串

openssl_decrypt函數(shù)解釋

如下表

參數(shù)列表描述
參數(shù)1:data要解密的數(shù)據(jù)字符串,通常是由 openssl_encrypt 函數(shù)加密后的結(jié)果。
參數(shù)2:method填寫加密方式,既然要解密那么就要知道是如何加密的,所以這里就必須填寫與加密時(shí)使用的算法模式相同! 例如: 加密模式為 AES-256-CBC 那么這里就必須填寫AES-256-CBC
參數(shù)3:key解密密鑰。這是用于解密的密鑰,與加密時(shí)使用的密鑰相同! 舉個(gè)生活上的案例,你用什么鑰匙鎖門,那么你就要用相應(yīng)的鑰匙來開門,對吧! 并且這個(gè)密鑰的長度也要一致!
參數(shù)4:options數(shù)據(jù)以什么形式進(jìn)行處理并返回 它有兩種常量設(shè)置方式: OPENSSL_RAW_DATA和 OPENSSL_ZERO_PADDING , 加密時(shí)設(shè)置的什么,這里就設(shè)置什么!
參數(shù)5:iv解密時(shí)需要使用加密時(shí)相同的 iv
.........................................

所以在上面的案例中encryptAES函數(shù)接受要加密的數(shù)據(jù)、密鑰初始向量,并返回加密后的結(jié)果。

而且decryptAES函數(shù)接受加密后的數(shù)據(jù)、密鑰初始向量,并返回解密后的原始數(shù)據(jù)。

特別注意的是密鑰初始向量的長度,必須要符合加密算法的要求!

大致流程如下圖:

以上就是php對稱加密和解密的實(shí)現(xiàn)詳解的詳細(xì)內(nèi)容,更多關(guān)于php對稱加密解密的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • php站內(nèi)搜索并高亮顯示關(guān)鍵字的實(shí)現(xiàn)代碼

    php站內(nèi)搜索并高亮顯示關(guān)鍵字的實(shí)現(xiàn)代碼

    將sql語句中包含的%$info%交給DBMS執(zhí)行的時(shí)候,他會(huì)查找字段中含有變量$info的值的信息
    2011-12-12
  • Smarty模板學(xué)習(xí)筆記之Smarty簡介

    Smarty模板學(xué)習(xí)筆記之Smarty簡介

    Smarty是一個(gè)使用PHP寫出來的模板PHP模板引擎,是目前業(yè)界最著名的PHP模板引擎之一。它分離了邏輯代碼和外在的內(nèi)容,提供了一種易于管理和使用的方法,用來將原本與HTML代碼混雜在一起PHP代碼邏輯分離。
    2014-05-05
  • php啟用sphinx全文搜索的實(shí)現(xiàn)方法

    php啟用sphinx全文搜索的實(shí)現(xiàn)方法

    這篇文章主要介紹了php啟用sphinx全文搜索的實(shí)現(xiàn)方法,詳細(xì)講述了sphinx相關(guān)的配置與使用技巧,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • PHP文件操作實(shí)現(xiàn)代碼分享

    PHP文件操作實(shí)現(xiàn)代碼分享

    PHP中提供了一系列的I/O函數(shù),能簡捷地實(shí)現(xiàn)我們所需要的功能,包括文件系統(tǒng)操作和目錄操作(如“復(fù)制[copy]”)。下面給大家介紹的是基本的文件讀寫操作:(1)讀文件;(2)寫文件;(3)追加到文件。
    2011-09-09
  • 利用PHP實(shí)現(xiàn)一個(gè)MySQL備份和恢復(fù)程序

    利用PHP實(shí)現(xiàn)一個(gè)MySQL備份和恢復(fù)程序

    由于客戶用的阿里云將要到期,需要把項(xiàng)目和阿里云上的數(shù)據(jù)庫都轉(zhuǎn)到政府云,數(shù)據(jù)肯定要轉(zhuǎn)過去,但是阿里云導(dǎo)出數(shù)據(jù)有數(shù)量限制,導(dǎo)出不全,所以就要程序執(zhí)行下,生成sql文件,然后導(dǎo)入政府云數(shù)據(jù)庫,下面分享下具體實(shí)現(xiàn)過程
    2023-09-09
  • 一文帶你掌握PHP中常見的文件操作

    一文帶你掌握PHP中常見的文件操作

    這篇文章主要為大家詳細(xì)介紹了PHP中常見的文件操作的相關(guān)知識,文字的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 簡要剖析PHP的Yii框架的組件化機(jī)制的基本知識

    簡要剖析PHP的Yii框架的組件化機(jī)制的基本知識

    這篇文章主要介紹了PHP的Yii框架的組件化機(jī)制的基本知識,對應(yīng)用程序CWebApplication組件進(jìn)行了簡要剖析,需要的朋友可以參考下
    2016-03-03
  • PHP讀取XML文件的方法實(shí)例總結(jié)【DOMDocument及simplexml方法】

    PHP讀取XML文件的方法實(shí)例總結(jié)【DOMDocument及simplexml方法】

    這篇文章主要介紹了PHP讀取XML文件的方法,結(jié)合實(shí)例形式總結(jié)分析了php基于DOMDocument及simplexml方法針對xml文件的載入、讀取等相關(guān)操作技巧,需要的朋友可以參考下
    2019-09-09
  • 6種解決PHP Trait屬性沖突問題的方法小結(jié)

    6種解決PHP Trait屬性沖突問題的方法小結(jié)

    在PHP中,Trait是一種用于在類之間共享方法的方法,然而,Trait中的成員屬性可能會(huì)導(dǎo)致沖突,所以本文為大家整理了6種解決Trait屬性沖突的方法,希望對大家有所幫助
    2024-02-02
  • php獲得客戶端瀏覽器名稱及版本的方法(基于ECShop函數(shù))

    php獲得客戶端瀏覽器名稱及版本的方法(基于ECShop函數(shù))

    這篇文章主要介紹了php獲得客戶端瀏覽器名稱及版本的方法,基于ECShop函數(shù)get_user_browser實(shí)現(xiàn)該功能,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-12-12

最新評論