在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 ...
随机推荐
- 【PHP篇】面向对象基础
1.声明:class 类名{ //成员属性(变量) 修饰符 $变量名=初值: //成员方法(函数) 修饰符 function 函数名(){ 执行:} } 2.生成类对象:$对象名=new 类名():/ ...
- [原创]K8Cscan插件之多种方式系统版本探测
[原创]K8 Cscan 大型内网渗透自定义扫描器 https://www.cnblogs.com/k8gege/p/10519321.html Cscan简介:何为自定义扫描器?其实也是插件化,但C ...
- 容器、容器集群管理平台与 Kubernetes 技术漫谈
原文:https://www.kubernetes.org.cn/4786.html 我们为什么使用容器? 我们为什么使用虚拟机(云主机)? 为什么使用物理机? 这一系列的问题并没有一个统一的标准答案 ...
- Mac下快速搭建PHP开发环境
最近做了一个后端的项目,是用PHP+MySQL+Nginx做的,所以把搭建环境的方法简单总结一下. 备注: 物料:Apache/Nginx+PHP+MySQL+MAMP Mac OS 10.12.1 ...
- Spring Boot – 自定义PropertyEditor
前言 PropertyEditor最初是属于Java Bean规范定义的,有意思的是,Spring也大规模的使用了PropertyEditors,以便实现以各种形式展现对象的属性: 举个例子,常见的用 ...
- 一个前端开发者换电脑的过程(IDE篇)
一台全新的电脑,需要做出怎样的改变,才可以摇身一变成为前端开发者能用的电脑呢.首先,我们需要安装一个编辑器,这里我们选择目前最火的vscode. 先去到它的官网,把对应版本的vscode下载下来. 然 ...
- 前端JS 与 后台C# 之间JSON序列化与反序列化(笔记)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 在 前端浏览器 和 后端服务器 之间通常会使用 JSON格式的数据 来进行数据交互,而JSON格式的 ...
- centos 7 linux 安装与卸载 tomcat 7
一.声明 本文采用操作系统版本: Centos 7 Linux系统 版本源:CentOS-7-x86_64-DVD-1708.iso 官网下载地址:http://isoredirect.centos. ...
- Ansible批量更新远程主机用户密码 (包括Ansible批量做ssh互信)
按照集团运维信息安全制度, 需要每个一段时间对线上服务器密码进行一次变更,通过shell脚本部署比较繁琐,所以决定采用ansible脚本对远程主机root密码进行批量重置,该脚本已经在稳定运行在正式环 ...
- 关于VS Code使用注意
1]:初次使用vs code或多或少有些问题.比如不小心把最左边的这四个快捷按钮消失.,直接按 alt+v 选择[显示活动板]就行了 2]:修改界面语言 快捷键ctrl+shift+p [修 ...