本文目錄一覽:
- 1、誰能通俗易懂地講講MD5加密原理?
- 2、PHP怎麼進行MD5加密
- 3、php md5加密 最多多少位
- 4、php中如何使用MD5加密?
- 5、php中如何使用MD5碼
- 6、php 支付寶接口官方給的md5簽名版本和rsa簽名版本的區別
誰能通俗易懂地講講MD5加密原理?
MD5算法的原理可簡要的敘述為:MD5碼以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理後,算法的輸出由四個32位分組組成,將這四個32位分組級聯後將生成一個128位散列值。
在MD5算法中,首先需要對信息進行填充,這個數據按位(bit)補充,要求最終的位數對512求模的結果為448。也就是說數據補位後,其位數長度只差64位(bit)就是512的整數倍。
即便是這個數據的位數對512求模的結果正好是448也必須進行補位。
補位的實現過程:首先在數據後補一個1 bit; 接着在後面補上一堆0 bit, 直到整個數據的位數對512求模的結果正好為448。總之,至少補1位,而最多可能補512位。
擴展資料
當需要保存某些密碼信息以用於身份確認時,如果直接將密碼信息以明碼方式保存在數據庫中,不使用任何保密措施,系統管理員就很容易能得到原來的密碼信息,這些信息一旦泄露, 密碼也很容易被破譯。為了增加安全性,有必要對數據庫中需要保密的信息進行加密,這樣,即使有人得到了整個數據庫,如果沒有解密算法,也不能得到原來的密碼信息。
MD5算法可以很好地解決這個問題,因為它可以將任意長度的輸入串經過計算得到固定長度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,並且這個算法是不可逆的,即便得到了加密以後的密文,也不可能通過解密算法反算出明文。
這樣就可以把用戶的密碼以MD5值(或類似的其它算法)的方式保存起來,用戶註冊的時候,系統是把用戶輸入的密碼計算成 MD5 值,然後再去和系統中保存的 MD5 值進行比較,如果密文相同,就可以認定密碼是正確的,否則密碼錯誤。
通過這樣的步驟,系統在並不知道用戶密碼明碼的情況下就可以確定用戶登錄系統的合法性。這樣不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。
MD5 算法還可以作為一種電子簽名的方法來使用,使用 MD5算法就可以為任何文件(不管其大小、格式、數量)產生一個獨一無二的“數字指紋”,藉助這個“數字指紋”,通過檢查文件前後 MD5 值是否發生了改變,就可以知道源文件是否被改動。
PHP怎麼進行MD5加密
1. MD5加密
string md5 ( string $str [, bool $raw_output = false ] )
參數
str — 原始字符串。
raw_output — 如果可選的 raw_output 被設置為 TRUE,那麼 MD5 報文摘要將以16字節長度的原始二進制格式返回。
這是一種不可逆加密,執行如下的代碼
$password = ‘123456’;
echo md5($password);
得到結果是e10adc3949ba59abbe56e057f20f883e
php md5加密 最多多少位
md5是一種散列函數。php 中md5加密結果默認長度是32 位,可將任意長度的“字節串”變換成一個128bit的大整數,並且它是一個不可逆的字符串變換算法。該結果字符長度是固定的,而且是唯一的。示例:
?php
$str=”hello baiduzhodao !”;
echo md5($str);
//81252f2a10b9a1a8c4c18c72f1c25555
$str2=”aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasadfasdfasdfasdfsadfasdf !”;
echo md5($str2);
//8e23206af66aefa1aad5699b685eceec
?
php中如何使用MD5加密?
把這段密文分割成若干段,對每段都進行一次MD5運算,然後把這堆密文連成一個超長的字符串,最後再進行一次MD5運算,得到仍然是長度為32位的密文。
?php
//把密文分割成兩段,每段16個字符
function md5_2_1($data)
{
//先把密碼加密成長度為32字符的密文
$data = md5($data);
//把密碼分割成兩段
$left = substr($data, 0, 16);
$right = substr($data, 16, 16);
//分別加密後再合併
$data = md5($left).md5($right);
//最後把長字串再加密一次,成為32字符密文
return md5($data);
}
//把密文分割成32段,每段1個字符
function md5_2_2($data)
{
$data = md5($data);
//循環地截取密文中的每個字符並進行加密、連接
for ($i = 0; $i 32; $i++) {
$data .= md5($data{$i});
}
//這時$data長度為1024個字符,再進行一次MD5運算
return md5($data);
}
?
php中如何使用MD5碼
首先介紹一下PHP中MD5函數的使用方法:
?php
$pswd1=md5(“cenusdesign”);
echo $pswd1; //運行結果為:fc60ec37d1c08d5b0fb67a8cd934d5ba
$pswd2=md5(“Cenusdesign”);
echo $pswd2; //運行結果為:067577d9fc109c80538c81d6f02bd293
?
顯然,經過md5加密後,原本“cenusdesign”轉變成了一組32位的字符串,而且,即使是一個字母的大小寫變化,這組字符串就會發生巨大的變化。
Cenus Design建議把用戶註冊時,將密碼首先經過MD5轉換,然後將轉換加密後的數據庫。在用戶登陸時,也將密碼先進行MD5轉化,再和數據庫中那組經過MD5加密的字符串進行比較。這樣,就可以做到在不知道用戶確切密碼的情況下完成密碼的比對操作。
php 支付寶接口官方給的md5簽名版本和rsa簽名版本的區別
雖然支付寶官方還未提供相關SDK,PHP確實可以實現RSA方式的簽名,這點其實很重要,由於不熟悉,在遇到困難的時候,經常會不由自主地想到是否PHP不支持RSA簽名,乾脆用MD5得了,這樣就沒有了前進的動力。其實說穿了MD5和RSA簽名,不同的只是簽名方式的區別,其他的都一樣,因此我這裡主要說一下如何用RSA進行簽名和驗簽。
首先你需要準備下面的東西:
php的openssl擴展里已經封裝好了驗簽的方法openssl_verify。
如果在Windows下的php.ini需要開啟Openssl模塊: extension=php_openssl.dll
商戶私鑰:
即RSA私鑰,按照手冊,按以下方式生成:
openssl genrsa -out rsa_private_key.pem 1024
商戶公鑰:
即RSA私鑰,按照手冊,按以下方式生成:
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
生成之後,按照手冊的說明,需要在簽約平台上傳公鑰,需要注意的是,上傳的時候需要把所有的注釋和換行都去掉。
另外手冊中還有如下命令:
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
該命令將RSA私鑰轉換成PKCS8格式,對於PHP來說,不需要。
支付寶公鑰:
根據手冊,在簽約平台獲得。
如果你直接複製下來的話,會得到一個字符串,需要進行下面的轉換;
1)把空格變成換行
2)添加註釋
比如你複製下來的公鑰是:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那轉換之後為:
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDRBMjkaBznjXk06ddsL751KyYt
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB
—–END PUBLIC KEY—–
把公鑰保存在文件里。
注意這個是2048位的公鑰應該是9行或者10行,不能為1行,不然PHP的openssl_pkey_get_public無法讀取,pub_key_id的結果為false,如果沒有—–BEGIN PUBLIC KEY—– 和 —–END PUBLIC KEY—– 可以自己加上,最後保存到一個rsa_public_key.pem文件中。
好了,現在已經有了所有的東西,先看簽名函數:
複製代碼
1 ?php
2 /**
3 * 簽名字符串
4 * @param $prestr 需要簽名的字符串
5 * return 簽名結果
6 */
7 function rsaSign($prestr) {
8 $public_key= file_get_contents(‘rsa_private_key.pem’);
9 $pkeyid = openssl_get_privatekey($public_key);
10 openssl_sign($prestr, $sign, $pkeyid);
11 openssl_free_key($pkeyid);
12 $sign = base64_encode($sign);
13 return $sign;
14 }
15 ?
複製代碼
注意點:
1.$prestr的內容和MD5一樣(參見手冊,但不包含最後的MD5密碼)
2.簽名用商戶私鑰
3.最後的簽名,需要用base64編碼
4.這個函數返回的值,就是這次請求的RSA簽名。
驗簽函數:
複製代碼
1 ?php
2 /**
3 * 驗證簽名
4 * @param $prestr 需要簽名的字符串
5 * @param $sign 簽名結果
6 * return 簽名結果
7 */
8 function rsaVerify($prestr, $sign) {
9 $sign = base64_decode($sign);
10 $public_key= file_get_contents(‘rsa_public_key.pem’);
11 $pkeyid = openssl_get_publickey($public_key);
12 if ($pkeyid) {
13 $verify = openssl_verify($prestr, $sign, $pkeyid);
14 openssl_free_key($pkeyid);
15 }
16 if($verify == 1){
17 return true;
18 }else{
19 return false;
20 }
21 }
22 ?
複製代碼
注意點:
1.$prestr的內容和MD5一樣(參見手冊)
2.$sign是支付寶接口返回的sign參數用base64_decode解碼之後的二進制
3.驗簽用支付寶公鑰
4.這個函數返回一個布爾值,直接告訴你,驗簽是否通過
支付寶官方提供的PHP版SDK demo中只對MD5加密方式進行了處理,但android 端和ios端 請求支付寶加密方式只能用RSA加密算法,這時服務端PHP就無法驗證簽名了,所以需要對demo進行一些修改。
1、修改alipay_notify.class.php文件
verifyNotify 函數第46行
$isSign = $this-getSignVeryfy($_POST, $_POST[“sign”]);
改成
$isSign = $this-getSignVeryfy($_POST, $_POST[“sign”], $_POST[“sign_type”]);
verifyReturn 函數第83行
$isSign = $this-getSignVeryfy($_GET, $_GET[“sign”]);
改成
$isSign = $this-getSignVeryfy($_GET, $_GET[“sign”], $_GET[“sign_type”]);
getSignVeryfy 函數 116行
function getSignVeryfy($para_temp, $sign) {
改成
function getSignVeryfy($para_temp, $sign, $sign_type) {
getSignVeryfy 函數 127行
switch (strtoupper(trim($this-alipay_config[‘sign_type’]))) {
case “MD5” :
$isSgin = md5Verify($prestr, $sign, $this-alipay_config[‘key’]);
break;
default :
$isSgin = false;
}
改成
switch (strtoupper(trim($sign_type))) {
case “MD5” :
$isSgin = md5Verify($prestr, $sign, $this-alipay_config[‘key’]);
break;
case “RSA” :
$isSgin = rsaVerify($prestr, $sign);
break;
default :
$isSgin = false;
}
2、新建一個alipay_rsa.function.php文件
複製代碼
1 ?php
2 /* *
3 * RSA
4 * 詳細:RSA加密
5 * 版本:3.3
6 * 日期:2014-02-20
7 * 說明:
8 * 以下代碼只是為了方便商戶測試而提供的樣例代碼,商戶可以根據自己網站的需要,按照技術文檔編寫,並非一定要使用該代碼。
9 * 該代碼僅供學習和研究支付寶接口使用,只是提供一個參考。
10 */
11 /**
12 * 簽名字符串
13 * @param $prestr 需要簽名的字符串
14 * return 簽名結果
15 */
16 function rsaSign($prestr) {
17 $public_key= file_get_contents(‘rsa_private_key.pem’);
18 $pkeyid = openssl_get_privatekey($public_key);
19 openssl_sign($prestr, $sign, $pkeyid);
20 openssl_free_key($pkeyid);
21 $sign = base64_encode($sign);
22 return $sign;
23 }
24 /**
25 * 驗證簽名
26 * @param $prestr 需要簽名的字符串
27 * @param $sign 簽名結果
28 * return 簽名結果
29 */
30 function rsaVerify($prestr, $sign) {
31 $sign = base64_decode($sign);
32 $public_key= file_get_contents(‘rsa_public_key.pem’);
33 $pkeyid = openssl_get_publickey($public_key);
34 if ($pkeyid) {
35 $verify = openssl_verify($prestr, $sign, $pkeyid);
36 openssl_free_key($pkeyid);
37 }
38 if($verify == 1){
39 return true;
40 }else{
41 return false;
42 }
43 }
44 ?
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/230760.html