在php中使用对称加密DES3,开发银行卡绑定,实名验证……
对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(key),可以有效保护金融数据,常见的对称加密有DES,3DES,AES、RC2、RC4、RC5。
DES3: 对DES算法的组合,指定3个KEY,运算3次DES,密钥KEY的总字符长度为24位。
说明: 接触这个主要是最近对接一个第三方的支付平台,调用他们的银行卡,证件,姓名的鉴权接口,需要对一些特殊数字(银行卡号,身份证号)进行DES加密,再进行签名请求。其实这个主要就是用来做银行卡绑定或者实名验证的。
流程:
1.客户端输入银行卡卡号,真实姓名,手机号,身份证号,手机号验证码
2.通过匹配当前用户提交的验证码和服务器上缓存的验证码是否一致再进行鉴权请求。
3.在支付后台上拿到DES密钥保存,对银行卡号,证件号等进行DES加密。
4.通常鉴权请求为四要素(真实姓名,身份证号,银行卡号,手机号[该卡预留号码])
5.对请求参数进行签名,再发送请求,根据结果,认证成功,则保存该用户身份证号,手机号,银行卡号。
附: 中间用户输完银行卡号时,需要根据卡号识别出卡类型(什么银行)和银行编码(全大写英文,类似银行的唯一id),记录该银行的联行号(银行的详细信息编号,精确到开户银行的省市区,支行)更佳,因为有时对公账户需要联行号。这个识别接口可以去网上找,有免费的,不过阿里云的接口更好用。
一、DES3类
<?php
namespace app\v1\extend;
class DES3{
//数据加密
function encrypt($input, $key)
{
$size = mcrypt_get_block_size(MCRYPT_3DES,'ecb');
$input = $this->pkcs5_pad($input, $size);
$key = str_pad($key,24,'0');
$td = mcrypt_module_open(MCRYPT_3DES, '', 'ecb', '');
$iv = @mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
@mcrypt_generic_init($td, $key, $iv);
$data = mcrypt_generic($td, $input);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$data = base64_encode($data);
return $data;
}
//数据解密
function decrypt($encrypted, $key)
{
$encrypted = base64_decode($encrypted);
$key = str_pad($key,24,'0');
$td = mcrypt_module_open(MCRYPT_3DES,'','ecb','');
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
$ks = mcrypt_enc_get_key_size($td);
@mcrypt_generic_init($td, $key, $iv);
$decrypted = mdecrypt_generic($td, $encrypted);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$y=$this->pkcs5_unpad($decrypted);
return $y;
}
function pkcs5_pad ($text, $blocksize)
{
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}
function pkcs5_unpad($text)
{
$pad = ord($text{strlen($text)-1});
if ($pad > strlen($text))
{
return false;
}
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
{
return false;
}
return substr($text, 0, -1 * $pad);
}
}
?>
二、业务逻辑
protected $desKey = 'uMPE00c86bPWWyjLhBUlkA82'; // des加密密钥
/**
* *鉴权请求
* @param [array] $[authParam] [绑卡基本信息输入]
* @return [array] [接口信息反馈]
*/
public function verifyAuth($authParam) {
if (empty($authParam)) {
return false;
}
$Des3 = new DES3(); // 实例Des加密类
$paramReq = array(
'P1_bizType' => 'Authentication', // 交易类型
'P2_customerNumber' => $this->cusNum, // 商户编号
'P3_orderId' => $authParam['orderNum'], // 商户请求流水号
'P4_timestamp' => date('YmdHis'), // 时间戳
'P5_verifyType' => $this->authType, // 认证类型
'P6_payerName' => $authParam['payerName'], // 姓名
'P7_idCardType' => 'IDCARD', // 证件类型
'P8_idCardNo' => $Des3->encrypt($authParam['idCardNo'],$this->desKey), // 证件号码
'P9_cardNo' => $Des3->encrypt($authParam['cardNo'],$this->desKey), // 银行卡号
'P10_year' => '', // 信用卡有效期年份
'P11_month' => '', // 信用卡有效期月份
'P12_cvv2' => '', // 信用卡安全码
'P13_phone' => $Des3->encrypt($authParam['phoneNo'],$this->desKey), // 手机号码
);
$preSignArr = array();
foreach($paramReq as $keys => $vals) {
$preSignArr[] = $vals;
}
// 组装签名
$paramReq['sign'] = $this->buildAuthSign($preSignArr, $this->authSignKey);
// 发起鉴权请求
$authReault = $this->curl_post($this->authHost, $paramReq);
return json_decode($authReault, true); // 返回请求结果
}
/**
* *生成鉴权请求签名
* @param [array] $[authParam] [鉴权参数集]
* @return [string] [md5签名串]
*/
protected function buildAuthSign($authParam,$signKey) {
$reqStr = "";
foreach($authParam as $keys=>$vals) {
$reqStr .= '&'.$vals;
}
// if(!$key) {
// return md5($reqStr);
// die;
// }
// return $key;
// die;
//$newSign = $reqStr.'&'.$signKey;
$newSign = md5($reqStr.'&'.$signKey);
return $newSign;
}
/**
* *curl发起post请求
* @param [string] $[url] [请求地址]
* @param [array] $[params] [请求参数集]
* @return [返回结果集]
*/
protected function curl_post($url,$params) {
$ch = curl_init(); // 初始化curl
curl_setopt($ch,CURLOPT_URL,$url); // 抓取指定网页
curl_setopt($ch, CURLOPT_HEADER, 0); // 设置header
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 要求结果为字符串且输出到屏幕上
// curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_POST, 1); // post提交方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
$data = curl_exec($ch); // 运行curl
curl_close($ch);
return($data); // 输出结果
}
个人公众号

在php中使用对称加密DES3,开发银行卡绑定,实名验证……的更多相关文章
- [转]理解SSL(https)中的对称加密与非对称加密
加密 解密 Tweet 密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母. 早期的密码学 古希腊人用一种叫 Scytale 的工具加密.更快的工具是 transposition ...
- 理解SSL、HTTPS原理中的对称加密与非对称加密
1.对称性加密 双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密. 简单来说就是:加密与解密都是同一个秘钥. 优点:通常在消息发送方需要加密大量数据时使用,算 ...
- JAVA中AES对称加密和解密
AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...
- JAVA中AES对称加密和解密以及与Python兼容
引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作. 由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取 ...
- 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式
# 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...
- C#开发中常用的加密解密方法
转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...
- .NET中的DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...
- AES —— JAVA中对称加密和解密
package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...
随机推荐
- Python中parameters与argument区别
定义(define)一个带parameters的函数: def addition(x,y): return (x+y) 这里的x,y就是parameter 调用addition(3,4) 调用(cal ...
- Ansible系列之roles使用说明
roles(角色)介绍 ansible自1.2版本开始引入的新特性,用于层次性,结构化地组织playbook.roles能够根据层次型结构自动装载变量文件.tasks以及handlers等.要使用ro ...
- HTTPS过程以及详细案例
1.HTTPS的过程 1.客户端向服务端发送请求,客户端主要向服务器提供以下信息: 支持的协议版本,比如TLS 1.0版. 一个客户端生成的随机数,稍后用于生成"对话密钥". 支持 ...
- jvm详情——5、选择合适的垃圾收集算法
回收器选择JVM给了三种选择:串行收集器.并行收集器.并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器. 默认情况下,JDK5.0以前都是使用串行收集器, ...
- SpringCloud实战9-Stream消息驱动
官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...
- shiro源码篇 - shiro的session创建,你值得拥有
前言 开心一刻 开学了,表弟和同学因为打架,老师让他回去叫家长.表弟硬气的说:不用,我打得过他.老师板着脸对他说:和你打架的那位同学已经回去叫家长了.表弟犹豫了一会依然硬气的说:可以,两个我也打得过. ...
- Webpack编译结果浅析
如今Webpack已经是一个不可或缺的前端构建工具,借助这个构建工具,我们可以使用比较新的技术(浏览器不能直接支持)来开发. 你是否好奇你写的代码经过Webpack构建之后会生成什么东西?是否有时调试 ...
- 浅谈SpringAOP
0. 写在最前面 之前实习天天在写业务,其中有一个业务是非常的复杂,涉及到了特别多的表.最后测下来,一个接口的时间,竟然要5s多. 当时想写一个AOP,来计算处理接口花费多长时间,也就是在业务逻辑的前 ...
- Deep Learning中的Large Batch Training相关理论与实践
背景 [作者:DeepLearningStack,阿里巴巴算法工程师,开源TensorFlow Contributor] 在分布式训练时,提高计算通信占比是提高计算加速比的有效手段,当网络通信优化到一 ...
- SHELL脚本--read命令
bash&shell系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 1.1 shell read简介 要与Linux交互,脚本获取 ...