php openssl使用日誌

公鑰/私鑰/簽名/驗證簽名/加密/解密/非對稱加密

  我們一般的加密是用一個密碼加密文件,然後解密也用同樣的密碼.這很好理解,這個是對稱加密.而有些加密時,加密用的一個密碼,而解密用另外一組密碼,這個叫非對稱加密,意思就是加密解密的密碼不一樣.初次接觸的人恐怕無論如何都理解不了.其實這是數學上的一個素數積求因子的原理的應用,如果你一定要搞懂,百度有大把大把的資料可以看,其結果就是用這一組密鑰中的一個來加密數據,可以用另一個解開.是的沒錯,公鑰和私鑰都可以用來加密數據,相反用另一個解開,公鑰加密數據,然後私鑰解密的情況被稱爲加密解密,私鑰加密數據,公鑰解密一般被稱爲簽名和驗證簽名.

  因爲公鑰加密的數據只有它相對應的私鑰可以解開,所以你可以把公鑰給人和人,讓他加密他想要傳送給你的數據,這個數據只有到了有私鑰的你這裏,纔可以解開成有用的數據,其他人就是得到了,也看懂內容.同理,如果你用你的私鑰對數據進行簽名,那這個數據就只有配對的公鑰可以解開,有這個私鑰的只有你,所以如果配對的公鑰解開了數據,就說明這數據是你發的,相反,則不是.這個被稱爲簽名.

  實際應用中,一般都是和對方交換公鑰,然後你要發給對方的數據,用他的公鑰加密,他得到後用他的私鑰解密,他要發給你的數據,用你的公鑰加密,你得到後用你的私鑰解密,這樣最大程度保證了安全性.

  RSA/DSA/SHA/MD5

  非對稱加密的算法有很多,比較著名的有RSA/DSA ,不同的是RSA可以用於加/解密,也可以用於簽名驗籤,DSA則只能用於簽名.至於SHA則是一種和md5相同的算法,它不是用於加密解密或者簽名的,它被稱爲摘要算法.就是通過一種算法,依據數據內容生成一種固定長度的摘要,這串摘要值與原數據存在對應關係,就是原數據會生成這個摘要,但是,這個摘要是不能還原成原數據的,嗯....,正常情況下是這樣的,這個算法起的作用就是,如果你把原數據修改一點點,那麼生成的摘要都會不同,傳輸過程中把原數據給你再給你一個摘要,你把得到的原數據同樣做一次摘要算法,與給你的摘要相比較就可以知道這個數據有沒有在傳輸過程中被修改了.

  實際應用過程中,因爲需要加密的數據可能會很大,進行加密費時費力,所以一般都會把原數據先進行摘要,然後對這個摘要值進行加密,將原數據的明文和加密後的摘要值一起傳給你.這樣你解開加密後的摘要值,再和你得到的數據進行的摘要值對應一下就可以知道數據有沒有被修改了,而且,因爲私鑰只有你有,只有你能解密摘要值,所以別人就算把原數據做了修改,然後生成一個假的摘要給你也是不行的,你這邊用密鑰也根本解不開.

   CA/PEM/DER/X509/PKCS

  一般的公鑰不會用明文傳輸給別人的,正常情況下都會生成一個文件,這個文件就是公鑰文件,然後這個文件可以交給其他人用於加密,但是傳輸過程中如果有人惡意破壞,將你的公鑰換成了他的公鑰,然後得到公鑰的一方加密數據,不是他就可以用他自己的密鑰解密看到數據了嗎,爲了解決這個問題,需要一個公證方來做這個事,任何人都可以找它來確認公鑰是誰發的.這就是CA,CA確認公鑰的原理也很簡單,它將它自己的公鑰發佈給所有人,然後一個想要發佈自己公鑰的人可以將自己的公鑰和一些身份信息發給CA,CA用自己的密鑰進行加密,這裏也可以稱爲簽名.然後這個包含了你的公鑰和你的信息的文件就可以稱爲證書文件了.這樣一來所有得到一些公鑰文件的人,通過CA的公鑰解密了文件,如果正常解密那麼機密后里面的信息一定是真的,因爲加密方只可能是CA,其他人沒它的密鑰啊.這樣你解開公鑰文件,看看裏面的信息就知道這個是不是那個你需要用來加密的公鑰了.

  實際應用中,一般人都不會找CA去簽名,因爲那是收錢的,所以可以自己做一個自簽名的證書文件,就是自己生成一對密鑰,然後再用自己生成的另外一對密鑰對這對密鑰進行簽名,這個只用於真正需要簽名證書的人,普通的加密解密數據,直接用公鑰和私鑰來做就可以了.

  密鑰文件的格式用OpenSSL生成的就只有PEM和DER兩種格式,PEM的是將密鑰用base64編碼表示出來的,直接打開你能看到一串的英文字母,DER格式是二進制的密鑰文件,直接打開,你可以看到........你什麼也看不懂!.X509是通用的證書文件格式定義.pkcs的一系列標準是指定的存放密鑰的文件標準,你只要知道PEM DER X509 PKCS這幾種格式是可以互相轉化的.

OpenSSL使用

  PHP的OpenSSL模塊要加載上很容易,百度一下,按着做就可以,但是這裏面其實有很多問題,首先一點就是windows環境的問題,OpenSSL開發是以linux環境爲基礎的,現在開發者的windows下lamp集成環境會出現很多錯誤,如果你去OpenSSL官網可以看到它提供了專門的windows環境OpenSSL安裝包.遺憾的是,沒有提供給你PHP調用的解決辦法,所以轉了一圈我們又回到PHP自帶的php_openssl.dll下了,你會發現在生成證書,提取公鑰等等地方都會出現錯誤.我的解決辦法是,在Apache的bin目錄下用命令行來生成各種證書密鑰,在PHP中只需要提取密鑰做驗證工作或者加密工作就可以了,密鑰你只生成一次嘛,那個項目也不會需要你不停的變密鑰對是吧.但是你要注意的是即使在Apache下使用命令行,你也需要一個特殊的openssl.cnf,這個可以用於windows環境,你可以百度一下,做了這些工作以後,你可以跟着我來生成各種密鑰了,假設你在apache/bin目錄下,所需要的exr,cnf,dll文件都拷貝到這個目錄下了,然後你打開dos命令行,進入這個目錄,做以下工作:

  

生成rsa密鑰
openssl genrsa -des3 -out prikey.pem
去除掉密鑰文件保護密碼
openssl rsa -in prikey.pem -out prikey.pem
分離出公鑰
openssl rsa -in prikey.pem -pubout -out pubkey.pem(獲取證書中的公鑰 openssl req -in myreq.pem  -out -pubkey.pem)
對文件進行簽名
open rsautl -sign -inkey prikey.pem -in a.txt -out sig.dat
驗證簽名
openssl rsautl -verify -inkey prikey.pem -in sig.dat
用公鑰對文件加密
openssl rsautl -encrypt -pubin -inkey pubkey.pem -in a.text -out b.text
用私鑰解密
openssl rsautl -decrypt -inkey prikey.pem -in b.text
用證書中的公鑰加密
opensll rsautl -encrypt -certin -inkey cert1.pem -in a.txt
 
或者
 
 
生成一個沒有加密的ca私鑰
openssl genrsa -out ca.key.pem 1024
生成ca對應的csr文件
openssl req -new -key ca.key.pem -out ca.csr
自簽名
openssl x509 -in ca.csr -out ca.cer -req -signkey ca.key.pem -days 7300 -extensions v3_ca
生成DER格式的私鑰
openssl pkcs8 -topk8 -inform PEM -outform DER -in ca.key.pem -out ca.private.der -nocrypt
讀取證書的內容,顯示在屏幕上
openssl x509 -in server.cer -noout -subject  -nameopt RFC2253
將der格式的證書轉成pem格式
openssl  x509  -inform PEM  -outform DER -in server.der -out server.pem

 如果那個命令提示你需要config文件,你在命令行的最後添加-config C:\wamp\bin\apache\apache2.2.8\conf\openssl.cnf,路徑是你openssl.cnf的路徑,根據你的cnf在哪裏放設置.

發佈了37 篇原創文章 · 獲贊 5 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章