首頁 >後端開發 >php教程 >php 以openssl為基礎實作的的加密解密方法

php 以openssl為基礎實作的的加密解密方法

怪我咯
怪我咯原創
2017-07-12 10:03:124579瀏覽

openssl OpenSSL簡介
SSL是Secure Socket Layer(安全通訊端協定)的縮寫,可以在Internet上提供秘密性傳輸。 Netscape公司在推出第一個網頁瀏覽器的同時,提出了SSL協定標準,目前已有3.0版本。 SSL採用公開金鑰技術。其目標是確保兩個應用間通訊的保密性和可靠性,可在伺服器端和用戶端同時實現支援。目前,利用公開密鑰技術的SSL協議,已成為Internet上保密通訊的工業標準。安全通訊端協定能使用戶/伺服器應用程式之間的通訊不被攻擊者竊聽,並且始終對伺服器進行認證,還可選擇對使用者進行認證。 SSL協定要求建立在可靠的傳輸層協定(TCP)之上。 SSL協定的優點在於它是與應用層協定獨立無關的,高層的應用層協定(例如:HTTP,FTP,TELNET等)能透明地建立於SSL協定之上。 SSL協定在應用層協定通訊前就已經完成加密演算法、通訊金鑰的協商及伺服器認證工作。在此之後應用層協定所傳送的資料都會被加密,從而確保通訊的私密性。透過以上敘述,SSL協定提供的安全頻道有以下三個特性: 1.資料的保密性 資訊加密就是把明碼的輸入檔用加密演算法轉換成加密的檔案以實現資料的保密。加密的過程需要用到密匙來加密資料然後再解密。沒有了金鑰,就無法解開加密的資料。資料加密之後,只有密匙要用一個安全的方法傳送。加密過的資料可以公開地傳送。 2.資料的一致性 加密也能確保資料的一致性。例如:訊息驗證碼(MAC),能夠校驗用戶提供的加密訊息,接收者可以用MAC來校驗加密數據,保證數據在傳輸過程中沒有被篡改過。 3.安全驗證 加密的另一個用途是用來作為個人的標識,使用者的密匙可以作為他的安全驗證的標識。 SSL是利用公開金鑰的加密技術(RSA)來作為用戶端與伺服器端在傳送機密資料時的加密通訊協定。
什麼是OpenSSL
眾多的密碼演算法、公鑰基礎設施標準以及SSL協議,或許這些有趣的功能會讓你產生實現所有這些演算法和標準的想法。果真如此,在對你表示敬佩的同時,還是忍不住提醒你:這是一個令人望而生畏的過程。這項工作不再是簡單的讀懂幾本密碼學專著和協議文檔那麼簡單,而是要理解所有這些演算法、標準和協議文檔的每一個細節,並用你可能很熟悉的C語言字元一個一個去實現這些定義和過程。我們不知道你將需要多少時間來完成這項有趣而可怕的工作,但肯定不是一年兩年的問題。
首先,應該感謝Eric A. Young和Tim J. Hudson,他們自1995年開始編寫後來具有巨大影響的OpenSSL軟體包,更令我們高興的是,這是一個沒有太多限制的開放原始碼的軟體包,這使得我們可以利用這個軟體包做很多事情。 Eric A. Young 和Tim J. Hudson是加拿大人,後來由於寫OpenSSL功成名就之後就到大公司裡賺大錢去了。 1998年,OpenSSL專案小組接手了OpenSSL的開發工作,並推出了OpenSSL的0.9.1版,到目前為止,OpenSSL的演算法已經非常完善,對SSL2.0、SSL3.0以及TLS1.0都支援。
OpenSSL採用C語言作為開發語言,這使得OpenSSL具有優秀的跨平台性能,這對於廣大技術人員來說是一件非常美妙的事情,可以在不同的平台使用同樣熟悉的東西。 OpenSSL支援Linux、Windows、BSD、Mac、VMS等平台,這使得OpenSSL具有廣泛的適用性。不過,對於目前新成長的C++程式設計師,可能對於C語言的程式碼不是很習慣,但習慣C語言總比使用C++重新寫一個跟OpenSSL相同功能的軟體包輕鬆不少。
OpenSSL整個軟體包大概可以分成三個主要的功能部分:密碼演算法庫、SSL協定庫以及應用程式。 OpenSSL的目錄結構自然也是圍繞這三個功能部分進行規劃的。
作為一個基於密碼學的安全開發包,OpenSSL提供的功能相當強大和全面,囊括了主要的密碼演算法、常用的金鑰和憑證封裝管理功能以及SSL協議,並提供了豐富的應用程式供測試或其它目的使用。
1.對稱加密演算法
OpenSSL總共提供了8種對稱加密演算法,其中7種是分組加密演算法,僅有的一種流加密演算法是RC4。這7種分組加密演算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支援電子密碼本模式(ECB)、加密分組連結模式(CBC)、加密回饋模式(CFB)和輸出回饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密回饋模式(CFB)和輸出回饋模式(OFB)分組長度是128位,其它演算法使用的則是64位。事實上,DES演算法裡面不只是常用的DES演算法,還支援三個金鑰和兩個金鑰3DES演算法。
2.非對稱加密演算法
OpenSSL總共實現了4種非對稱加密演算法,包括DH演算法、RSA演算法、DSA演算法和橢圓曲線演算法(EC)。 DH演算法一般用戶金鑰交換。 RSA演算法既可以用於金鑰交換,也可以用於數位簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於資料加密。 DSA演算法則一般只用於數位簽章。
3.資訊摘要演算法
OpenSSL實作了5種資訊摘要演算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。 SHA演算法事實上包含了SHA和SHA1兩種資訊摘要演算法,此外,OpenSSL也實作了DSS標準中規定的兩種資訊摘要演算法DSS和DSS1。
4.金鑰和憑證管理
金鑰和憑證管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支援多種標準。
首先,OpenSSL實作了ASN.1的憑證和金鑰相關標準,提供了對憑證、公鑰、私鑰、憑證要求以及CRL等資料物件的DER、PEM和BASE64的編解碼功能。 OpenSSL提供了產生各種公開金鑰對和對稱金鑰的方法、函數和應用程序,同時提供了對公鑰和私鑰的DER編解碼功能。並實作了私鑰的PKCS#12和PKCS#8的編解碼功能。 OpenSSL在標準中提供了對私鑰的加密保護功能,使得金鑰可以安全地進行儲存和分發。
在此基礎上,OpenSSL實作了憑證的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一個文字資料庫,支援憑證的管理功能,包括憑證金鑰產生、請求產生、憑證簽發、撤銷和驗證等功能。
事實上,OpenSSL提供的CA應用程式就是一個小型的憑證管理中心(CA),實現了憑證所簽發的整個流程和憑證管理的大部分機制。
5.SSL和TLS協定
OpenSSL實作了SSL協定的SSLv2和SSLv3,支援了其中絕大部分演算法協定。 OpenSSL也實作了TLSv1.0,TLS是SSLv3的標準化版,雖然差異不大,但畢竟有許多細節不盡相同。
雖然已經有眾多的軟體實現了OpenSSL的功能,但是OpenSSL裡面實現的SSL協定能夠讓我們對SSL協定有一個更加清楚的認識,因為至少存在兩點:一是OpenSSL實現的SSL協定是開放原始碼的,我們可以追究SSL協議實現的每一個細節;二是OpenSSL實現的SSL協議是純粹的SSL協議,沒有跟其它協議(如HTTP)協議結合在一起,澄清了SSL協議的本來面目。
6.應用程式
OpenSSL的應用程式已經成為了OpenSSL重要的一個組成部分,其重要性恐怕是OpenSSL的開發者開始沒有想到的。現在OpenSSL的應用中,很多都是基於OpenSSL的應用程式而不是其API的,如OpenCA,就是完全使用OpenSSL的應用程式實現的。 OpenSSL的應用程式是基於OpenSSL的密碼演算法庫和SSL協定庫寫成的,所以也是一些非常好的OpenSSL的API使用範例,讀懂所有這些範例,你對OpenSSL的API使用了解就比較全面了,當然,這也是一項鍛鍊你的意志力的工作。
OpenSSL的應用程式提供了相對全面的功能,在相當多的人看來,OpenSSL已經為自己做好了一切,不需要再做更多的開發工作了,所以,他們也把這些應用程序成為OpenSSL的指令。 OpenSSL的應用程式主要包括金鑰產生、憑證管理、格式轉換、資料加密和簽章、SSL測試以及其它輔助配置功能。
7.Engine機制Engine機制的出現是在OpenSSL的0.9.6版的事情,開始的時候是將普通版本跟支援Engine的版本分開的,到了OpenSSL的0.9.7版,Engine機制整合到了OpenSSL的核心中,成為了OpenSSL不可缺少的一部分。 Engine機制目的是為了使OpenSSL能夠透明地使用第三方提供的軟體加密庫或硬體加密設備進行加密。 OpenSSL的Engine機製成功地達到了這個目的,這使得OpenSSL已經不僅僅使一個加密庫,而是提供了一個通用地加密接口,能夠與絕大部分加密庫或者加密設備協調工作。當然,要讓特定加密庫或加密設備更OpenSSL協調工作,需要寫少量的介面程式碼,但是這樣的工作量並不大,雖然還是需要一點密碼學的知識。 Engine機制的功能跟Windows提供的CSP功能目標基本上是相同的。目前,OpenSSL的0.9.7版本支援的內嵌第三方加密設備有8種,包括:CryptoSwift、nCipher、Atalla、Nuron、UBSEC、Aep、SureWare以及IBM 4758 CCA的硬體加密設備。現在也出現了支援PKCS#11介面的Engine接口,支援微軟CryptoAPI的介面也有人進行開發。當然,所有上述Engine介面支援不一定很全面,例如,可能支援其中一兩種公開金鑰演算法。
8.輔助功能
BIO機制是OpenSSL提供的一種高層IO接口,該接口封裝了幾乎所有類型的IO接口,如內存訪問、文件訪問以及Socket等。這使得程式碼的重用性大幅提高,OpenSSL提供API的複雜性也降低了許多。
OpenSSL對於隨機數的產生和管理也提供了一整套的解決方法和支援API函數。隨機數的好壞是決定一個金鑰是否安全的重要前提。
OpenSSL也提供了其它的一些輔助功能,例如從口令產生金鑰的API,憑證簽發和管理中的設定檔機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發現很多這樣的小功能,讓你不斷有新的驚喜。

這篇文章主要介紹了php實作基於openssl的加密解密方法,結合實例形式分析了php自訂函數實作基於openssl的加密解密操作相關技巧,需要的朋友可以參考下

本文實例講述了php實作基於openssl的加密解密方法。分享給大家供大家參考,具體如下:

透過openssl加密解密方法

1. openssl加密方法:

function encrypt($id){
  $id=serialize($id);
  $key="1112121212121212121212";
  $data['iv']=base64_encode(substr('fdakinel;injajdji',0,16));
  $data['value']=openssl_encrypt($id, 'AES-256-CBC',$key,0,base64_decode($data['iv']));
  $encrypt=base64_encode(json_encode($data));
  return $encrypt;
}

2. openssl解密方法:

function decrypt($encrypt)
{
  $key = '1112121212121212121212';//解密钥匙
  $encrypt = json_decode(base64_decode($encrypt), true);
  $iv = base64_decode($encrypt['iv']);
  $decrypt = openssl_decrypt($encrypt['value'], 'AES-256-CBC', $key, 0, $iv);
  $id = unserialize($decrypt);
  if($id){
    return $id;
  }else{
    return 0;
  }
}

以上是php 以openssl為基礎實作的的加密解密方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn