PHP實(shí)現(xiàn)的MD5結(jié)合RSA簽名算法實(shí)例
本文實(shí)例講述了PHP實(shí)現(xiàn)的MD5結(jié)合RSA簽名算法。分享給大家供大家參考,具體如下:
<?php
class Md5RSA{
/**
* 利用約定數(shù)據(jù)和私鑰生成數(shù)字簽名
* @param $data 待簽數(shù)據(jù)
* @return String 返回簽名
*/
public function sign($data='')
{
if (empty($data))
{
return False;
}
$private_key = file_get_contents(dirname(__FILE__).'/rsa_private_key.pem');
if (empty($private_key))
{
echo "Private Key error!";
return False;
}
$pkeyid = openssl_get_privatekey($private_key);
if (empty($pkeyid))
{
echo "private key resource identifier False!";
return False;
}
$verify = openssl_sign($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
openssl_free_key($pkeyid);
return $signature;
}
/**
* 利用公鑰和數(shù)字簽名以及約定數(shù)據(jù)驗(yàn)證合法性
* @param $data 待驗(yàn)證數(shù)據(jù)
* @param $signature 數(shù)字簽名
* @return -1:error驗(yàn)證錯(cuò)誤 1:correct驗(yàn)證成功 0:incorrect驗(yàn)證失敗
*/
public function isValid($data='', $signature='')
{
if (empty($data) || empty($signature))
{
return False;
}
$public_key = file_get_contents(dirname(__FILE__).'/rsa_public_key.pem');
if (empty($public_key))
{
echo "Public Key error!";
return False;
}
$pkeyid = openssl_get_publickey($public_key);
if (empty($pkeyid))
{
echo "public key resource identifier False!";
return False;
}
$ret = openssl_verify($data, $signature, $pkeyid, OPENSSL_ALGO_MD5);
switch ($ret)
{
case -1:
echo "error";
break;
default:
echo $ret==1 ? "correct" : "incorrect";//0:incorrect
break;
}
return $ret;
}
}
附:openssl生成證書(shū)以及獲取公鑰和私鑰說(shuō)明
一、RSA方式
1. 建立CA根證書(shū) 1) 建立目錄RSA 2) 創(chuàng)建以下子目錄certs, crl, newcerts 3) 在RSA目錄下執(zhí)行以下操作:
echo 01 > serial
touch index.txt
openssl req -new -x509 -newkey rsa:1024 -keyout CA.key -out CA.pem (生成自簽名CA證書(shū))
2. 客戶端證書(shū)請(qǐng)求
openssl req -new -newkey rsa:1024 -keyout ddmdd_a.key -out ddmdd_a.req (生成ddmdd_a的密鑰和證書(shū)請(qǐng)求,注意: 此處所填寫(xiě)的用戶信息必須與CA證書(shū)信息完全一致)
openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub (導(dǎo)出公鑰)
3. 為客戶簽發(fā)證書(shū)
openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_a.req -out ddmdd_a.pem -notext (使用CA密鑰和證書(shū)為ddmdd_a簽發(fā)證書(shū)ddmdd_a.pem)
openssl ca -keyfile CA.key -cert CA.pem -in subca_rsareq.pem -out subca.pem -notext (簽發(fā)二級(jí)CA證書(shū))
4. 轉(zhuǎn)換證書(shū)格式
openssl x509 -inform pem -outform der -in ddmdd_a.pem -out ddmdd_a.der
openssl pkcs12 -export -in ddmdd_a.pem -inkey ddmdd_a_rsakey.pem -out ddmdd_a.pfx
openssl pkcs12 -in ddmdd_a.pfx -out ddmdd_a.pem
openssl rsa -in ddmdd_a.key -out ddmdd_a_open.key (刪除私鑰密碼)
5. 生成證書(shū)撤消列表
echo 01 > crlnumber
openssl ca -keyfile CA.key -cert CA.pem -revoke ddmdd_a.pem (從CA中撤消證書(shū)ddmdd_a.pem)
openssl ca -gencrl -keyfile CA.key -cert CA.pem -out CA.crl (生成或更新證書(shū)撤消列表)
6. 查看證書(shū)信息
openssl x509 -in CA.pem -noout –text
二、DSA方式
1. 建立CA根證書(shū) 1) 建立目錄DSA 2) 創(chuàng)建以下子目錄certs, crl, newcerts 3) 在DSA目錄下執(zhí)行以下操作:
echo 01 > serial
touch index.txt
openssl dsaparam -out CA.para 1024 (生成dsa參數(shù)文件)
openssl req -new -x509 -newkey dsa:CA.para -keyout CA.key -out CA.pem (使用dsa參數(shù)生成自簽名CA證書(shū))
2. 客戶端證書(shū)請(qǐng)求
openssl dsaparam -out ddmdd_b.para 1024 (生成dsa參數(shù)文件)
openssl req -new -newkey dsa:ddmdd_b.para -keyout ddmdd_b.key -out ddmdd_b.req (使用dsa參數(shù)生成ddmdd_b的密鑰和證書(shū)請(qǐng)求,注意: 此處所填寫(xiě)的用戶信息必須與CA證書(shū)信息完全一致)
openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub (導(dǎo)出公鑰)
3. 為客戶簽發(fā)證書(shū)
openssl ca -keyfile CA.key -cert CA.pem -in ddmdd_b.req -out ddmdd_b.pem -notext (使用CA密鑰和證書(shū)為ddmdd_b簽發(fā)證書(shū)ddmdd_b.pem)
三、獲取公鑰和私鑰
a) 通過(guò)以上方法的生成證書(shū)的,可以通過(guò)一下命令獲得公鑰和私鑰。
導(dǎo)出公鑰:
DSA方式:openssl dsa -in ddmdd_b.key -pubout -out ddmdd_b.pub.pem
RSA方式:openssl rsa -in ddmdd_a.key -pubout -out ddmdd_a.pub.pem
導(dǎo)出私鑰:
openssl rsa -in server.key -text > private.pem
b)直接生成公鑰和私鑰:
openssl genrsa -out private.pem 1024
openssl pkcs8 -nocrypt -topk8 -in private.pem -out pkcs8.pem
openssl rsa -pubout -in private.pem public.pem
另:不清楚RSA算法的推薦看阮老師的http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
PS:關(guān)于加密解密感興趣的朋友還可以參考本站在線工具:
文字在線加密解密工具(包含AES、DES、RC4等):
http://tools.jb51.net/password/txt_encode
MD5在線加密工具:
http://tools.jb51.net/password/CreateMD5Password
在線散列/哈希算法加密工具:
http://tools.jb51.net/password/hash_encrypt
在線MD5/hash/SHA-1/SHA-2/SHA-256/SHA-512/SHA-3/RIPEMD-160加密工具:
http://tools.jb51.net/password/hash_md5_sha
在線sha1/sha224/sha256/sha384/sha512加密工具:
http://tools.jb51.net/password/sha_encode
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《php加密方法總結(jié)》、《PHP編碼與轉(zhuǎn)碼操作技巧匯總》、《PHP數(shù)學(xué)運(yùn)算技巧總結(jié)》、《PHP數(shù)組(Array)操作技巧大全》、《php字符串(string)用法總結(jié)》、《PHP數(shù)據(jù)結(jié)構(gòu)與算法教程》、《php程序設(shè)計(jì)算法總結(jié)》及《php正則表達(dá)式用法總結(jié)》
希望本文所述對(duì)大家PHP程序設(shè)計(jì)有所幫助。
相關(guān)文章
ThinkPHP刪除欄目(實(shí)現(xiàn)批量刪除欄目)
下面小編就為大家?guī)?lái)一篇ThinkPHP刪除欄目(實(shí)現(xiàn)批量刪除欄目)。小編覺(jué)得挺不錯(cuò)的?,F(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06
php設(shè)計(jì)模式 Prototype (原型模式)代碼
用原型實(shí)例指定創(chuàng)建對(duì)象的種類(lèi).并且通過(guò)拷貝這個(gè)原型來(lái)創(chuàng)建新的對(duì)象2011-06-06
php性能優(yōu)化進(jìn)階不要在for循環(huán)中操作DB
這篇文章主要為大家介紹了php性能優(yōu)化進(jìn)階不要在for循環(huán)中操作DB,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
提高PHP編程效率的53個(gè)要點(diǎn)(經(jīng)驗(yàn)小結(jié))
下面是php老手整理的一些開(kāi)發(fā)經(jīng)驗(yàn)之談,提高php的執(zhí)行效率。2010-09-09
php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法
這篇文章主要介紹了php堆排序?qū)崿F(xiàn)原理與應(yīng)用方法,較為詳細(xì)的分析了堆排序的原理及使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-01-01
PHP面向?qū)ο髮W(xué)習(xí)筆記之一 基礎(chǔ)概念
PHP面向?qū)ο髮W(xué)習(xí)筆記之一 基礎(chǔ)概念,想要學(xué)習(xí)PHP面向?qū)ο缶幊痰呐笥芽梢詤⒖枷?/div> 2012-10-10
PHP利用ThinkPHP6完整實(shí)現(xiàn)用戶分頁(yè)功能
分頁(yè)功能在Web開(kāi)發(fā)中是一個(gè)非常常見(jiàn)的需求,特別是在處理大量數(shù)據(jù)時(shí),為了提高用戶體驗(yàn)和性能,將數(shù)據(jù)分頁(yè)展示是必不可少的,ThinkPHP6作為一款流行的PHP框架,自帶了強(qiáng)大的分頁(yè)功能,本文將詳細(xì)介紹如何使用ThinkPHP6實(shí)現(xiàn)分頁(yè)功能,需要的朋友可以參考下2023-12-12
PHP入門(mén)教程之?dāng)?shù)學(xué)運(yùn)算技巧總結(jié)
這篇文章主要介紹了PHP入門(mén)教程之?dāng)?shù)學(xué)運(yùn)算技巧,結(jié)合實(shí)例形式總結(jié)分析了php數(shù)值運(yùn)算、變量檢測(cè)、隨機(jī)數(shù)、絕對(duì)值、取整、最大值、最小值、四舍五入等操作技巧,需要的朋友可以參考下2016-09-09最新評(píng)論

