#!/usr/bin/envpython
#-*-coding:UTF-8-*-
importhashlib
string='123456SkinRun51'
md5=hashlib.md5()
md5.update(string.encode('utf-8'))
res=md5.hexdigest()
print('md5加密后结果:',res)
-------------------------------------------
echomd5(utf8_encode('123456SkinRun51')).PHP_EOL;
exit();
叙述:python3.6.6 ;php7
‘贰’ 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)添加注释
比如你复制下来的公钥是:
ztPFg0D3tu7jLqCacgqL+lbshIaItDGEXAMZmKa3DV6Wxy+l48YMo0RyS+dWze4M
UmuxHU/v6tiT0ZTXJN3EwrjCtCyyttdv/ROB3CkheXnTKB76reTkQqg57OWW+m9j
TCoccYMDXEIWYTs3CwIDAQAB,那转换之后为:
-----BEGIN PUBLIC KEY-----
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 ?>
‘叁’ PHP框架都有哪些
PHP框架是一种基础架构,能在项目开发过程中提高效率,创建更稳定的程序,并减少开发者重复编写代码。当前市面上提供了众多PHP教程和框架,极大简化了开发过程,快速实现系统功能。以下是一些主流的PHP框架。
1、Laravel
Laravel是目前最受欢迎的PHP框架之一,于2011年6月发布。它具有强大的rest router、artisan命令行工具、可继承的模板、blade模板、ORM操作数据库、migration以及强大的测试功能和composer依赖管理。
2、ThinkPHP
这是一个由国人团队开发的PHP框架,在国内企业中广泛使用。ThinkPHP的优势在于有着完整的中文文档,MVC简单易用,以及较低的学习成本。还支持XML标签库技术的编译型模版引擎和动态编译,具有独特的数据验证和自动填充,MD5数据加密等功能。
3、Yii
Yii是一个基于组件的高性能PHP框架,被认为是PHP框架中效率最高的之一。专为开发大规模Web应用而设计。提供了各种功能,包括MVC、DAO/ActiveRecord、widgets、caching、等级式RBAC、Web服务、主体化、I18N和L10N等,满足了现代Web 2.0应用开发的需求。Yii框架的价格也相对较为实惠。
4、CodeIgniter
CodeIgniter是一个应用开发框架,为开发PHP网站的人们提供一个工具包,被广泛用于开发小型到中型的应用程序,具有简单的配置和快速运行的特点,适合初学者和对性能有高要求的开发者。另外,CodeIgniter还提供了数据库抽象、表单验证、缓存和会话管理等功能。
5、CakePHP
CakePHP是一款快速而简单的PHP框架,遵循"约定优于配置"的原则,让开发者更专注于业务逻辑,而不是代码的细节。CakePHP提供了数据库访问、模板引擎、表单处理和安全验证等功能,适用于构建中型到大型的应用程序,能够快速构建出稳健可靠的Web应用。
6、Symfony
Symfony是由SensioLabs赞助的PHP开源框架,适用于开发功能完整的Web应用程序。许多开源项目(如Drupal、Composer和phpBB)都使用Symfony组件。Symfony与PHP Unit和其他独立库集成,具有高度的灵活性,可以处理具有数十亿连接的企业应用程序。同时Symfony也被用于构建微型站点。
7、Zend Framework
Zend Framework是一个基于PHP的开源Web应用程序框架,提供了各种数据库、缓存和其他常见的Web开发任务。专注于安全性和性能,并提供了灵活的架构,适用于开发各种规模的应用程序。Zend Framework也是一个模块化的框架,允许开发人员根据项目需求选择所需的组件,从而提供了高度的定制能力。
8、Slim
Slim是一个PHP微型框架,其开发灵感来源于Ruby的Sinatra微型框架。Slim适用于创建小规模的CRUD应用程序,而不是完整的堆栈框架。Slim是快速原型设计的理想工具,可以用于创建带有用户界面的全功能Web应用程序。同时,Slim提供了许多功能,如客户端HTTP缓存、URL路由、会话管理、cookie加密和闪存消息。
PHP开发框架有很多,每个框架都有其独特的特性和优势,无论选择哪个框架,都要确保学习和掌握其基本概念和工作原理,如此才能更好地利用框架的特性来提高开发效率和代码质量。
‘肆’ PHP怎么在mysql insert into语句中实现md5加密
if ($_POST["submit"]) { $sql="insert into reguser (username,password,sex,email,name,idcard,address,phone,qq,regtime)". " values ('$_POST[username]','".md5($_POST[password])."','$_POST[sex]','$_POST[email]','$_POST[name]','$_POST[idcard]','$_POST[address]','$_POST[phone]','$_POST[qq]',now())";
‘伍’ php 获得上传文件的MD5
if(isset($_FILES['multimedia']) && $_FILES['multimedia']['error']==0){$file_name = $_FILES['multimedia']['name'];$size = getimagesize($_FILES['multimedia']['tmp_name']); $type = $_FILES['multimedia']['type'];$original = $_FILES['multimedia']['tmp_name'];$md5 = md5_file($original);echo $md5;}
md5_file()
md5_file() 函数计算文件的 MD5 散列。md5() 函数使用 RSA 数据安全,包括 MD5 报文摘译算法。如果成功,则返回所计算的 MD5 散列,如果失败,则返回 false。
语法:md5(string,raw)
参数string,必需。规定要计算的文件。
参数charlist,可选。规定十六进制或二进制输出格式:TRUE - 原始 16 字符二进制格式;FALSE - 默认。32 字符十六进制数。
<?php$filename = "test.txt";$md5file = md5_file($filename);echo $md5file;?>
存储 "test.txt" 文件的 MD5 散列:
<?php$md5file = md5_file("test.txt");file_put_contents("md5file.txt",$md5file);?>
在本例中,我们将检测 "test.txt" 是否已被更改(即是否 MD5 散列已被更改):
<?php$md5file = file_get_contents("md5file.txt");if (md5_file("test.txt") == $md5file){echo "The file is ok.";}else{echo "The file has been changed.";}?>
输出:
The file is ok.
‘陆’ 说能说清楚C#md5和php md5加密技术的区别,以实例说明
原理其实都是一样的,你说的种子问题其实可以理解为加密盐
同样的值的MD5结果是一样的,前提是编码需要一致
默认的编码是Unicode
对非英文字符 ,编码不同MD5的结果也是不同的,
以下是对字符"梦世繁华"的md5值的比较,你可以看看
md5("梦世繁华")
UTF-8 32位GB2312 32位Unicode 32位
//=====================================================
md5 16
md5 16 utf-8
a2cccbcf9c0e3ca9
A2CCCBCF9C0E3CA9
md5 16 gb2312
2f82ed6fb6a9d0a8
2F82ED6FB6A9D0A8
md5 16 unicode
9821973ddd33dc81
9821973DDD33DC81
//=====================================================
md5 Hash Utf-8
e5-18-ec-8a-a2-cc-cb-cf-9c-0e-3c-a9-1d-e2-9b-5a
E5-18-EC-8A-A2-CC-CB-CF-9C-0E-3C-A9-1D-E2-9B-5A
md5 hash GB2312
5e-ba-da-d0-2f-82-ed-6f-b6-a9-d0-a8-59-9b-c7-3a
5E-BA-DA-D0-2F-82-ED-6F-B6-A9-D0-A8-59-9B-C7-3A
md5 hash UNICode
5f-df-ba-4d-98-21-97-3d-dd-33-dc-81-8b-e3-1c-2f
5F-DF-BA-4D-98-21-97-3D-DD-33-DC-81-8B-E3-1C-2F
//=====================================================
Sha1Hash Utf-8
a8-26-5f-e6-69-27-18-f4-3c-1b-16-30-10-9e-ee-3f-8d-df-3a-84
A8-26-5F-E6-69-27-18-F4-3C-1B-16-30-10-9E-EE-3F-8D-DF-3A-84
Sha1Hash GB2312
b4-eb-13-07-bc-7b-9b-d3-e4-8c-4a-82-6a-9b-7b-8b-1e-4a-dd-3b
B4-EB-13-07-BC-7B-9B-D3-E4-8C-4A-82-6A-9B-7B-8B-1E-4A-DD-3B
Sha1Hash UNICode
af-be-2d-d5-d2-7e-fa-55-ea-11-3d-ad-da-35-fc-a5-b9-c4-e9-88
AF-BE-2D-D5-D2-7E-FA-55-EA-11-3D-AD-DA-35-FC-A5-B9-C4-E9-88