php支付寶md5加密算法,md5加密算法原理及實現

本文目錄一覽:

誰能通俗易懂地講講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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-10 18:18
下一篇 2024-12-10 18:18

相關推薦

  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Harris角點檢測算法原理與實現

    本文將從多個方面對Harris角點檢測算法進行詳細的闡述,包括算法原理、實現步驟、代碼實現等。 一、Harris角點檢測算法原理 Harris角點檢測算法是一種經典的計算機視覺算法…

    編程 2025-04-29
  • 瘦臉算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉算法 Python 實現的原理和方法,包括該算法的意義、流程、代碼實現、優化等內容。 一、算法意義 隨着科技的發展,瘦臉算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • PHP怎麼接幣

    想要在自己的網站或應用中接受比特幣等加密貨幣的支付,就需要對該加密貨幣擁有一定的了解,並使用對應的API進行開發。本文將從多個方面詳細闡述如何使用PHP接受加密貨幣的支付。 一、環…

    編程 2025-04-29
  • 神經網絡BP算法原理

    本文將從多個方面對神經網絡BP算法原理進行詳細闡述,並給出完整的代碼示例。 一、BP算法簡介 BP算法是一種常用的神經網絡訓練算法,其全稱為反向傳播算法。BP算法的基本思想是通過正…

    編程 2025-04-29
  • Java微信支付寶分賬指南

    本文將詳細介紹如何使用Java代碼實現微信和支付寶分賬功能,以及實現自定義分賬規則和查詢分賬結果。 一、微信支付分賬 微信支付分賬是指商戶將訂單的資金分給多個分賬接收方。常用於分潤…

    編程 2025-04-28
  • 使用PHP foreach遍歷有相同屬性的值

    本篇文章將介紹如何使用PHP foreach遍歷具有相同屬性的值,並給出相應的代碼示例。 一、基礎概念 在講解如何使用PHP foreach遍歷有相同屬性的值之前,我們需要先了解幾…

    編程 2025-04-28
  • GloVe詞向量:從原理到應用

    本文將從多個方面對GloVe詞向量進行詳細的闡述,包括其原理、優缺點、應用以及代碼實現。如果你對詞向量感興趣,那麼這篇文章將會是一次很好的學習體驗。 一、原理 GloVe(Glob…

    編程 2025-04-27
  • PHP獲取301跳轉後的地址

    本文將為大家介紹如何使用PHP獲取301跳轉後的地址。301重定向是什麼呢?當我們訪問一個網頁A,但是它已經被遷移到了另一個地址B,此時若服務器端做了301重定向,那麼你的瀏覽器在…

    編程 2025-04-27
  • 編譯原理語法分析思維導圖

    本文將從以下幾個方面詳細闡述編譯原理語法分析思維導圖: 一、語法分析介紹 1.1 語法分析的定義 語法分析是編譯器中將輸入的字符流轉換成抽象語法樹的一個過程。該過程的目的是確保輸入…

    編程 2025-04-27

發表回復

登錄後才能評論