对称加密:对称加密是一种数据加密算法,对一组数据的加密和解密都使用一样的密钥(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,开发银行卡绑定,实名验证……的更多相关文章

  1. [转]理解SSL(https)中的对称加密与非对称加密

    加密 解密 Tweet   密码学最早可以追溯到古希腊罗马时代,那时的加密方法很简单:替换字母. 早期的密码学 古希腊人用一种叫 Scytale 的工具加密.更快的工具是 transposition ...

  2. 理解SSL、HTTPS原理中的对称加密与非对称加密

    1.对称性加密 双方使用的同一个密钥,既可以加密又可以解密,这种加密方法称为对称加密,也称为单密钥加密. 简单来说就是:加密与解密都是同一个秘钥.   优点:通常在消息发送方需要加密大量数据时使用,算 ...

  3. JAVA中AES对称加密和解密

    AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingExce ...

  4. JAVA中AES对称加密和解密以及与Python兼容

    引言:本文主要解决Java中用AES加密及解密,同时可通过Python脚本对Java加密后的字符进行解密的操作. 由于近期工作中用到需要使用Java对一串密钥进行加密,并且后台通过Python语言读取 ...

  5. 探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!

    前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...

  6. 几个例子理解对称加密与非对称加密、公钥与私钥、签名与验签、数字证书、HTTPS加密方式

    # 原创,转载请留言联系 为什么会出现这么多加密啊,公钥私钥啊,签名啊这些东西呢?说到底还是保证双方通信的安全性与完整性.例如小明发一封表白邮件给小红,他总不希望给别人看见吧.而各种各样的技术就是为了 ...

  7. C#开发中常用的加密解密方法

    转载自:https://www.cnblogs.com/bj981/p/11203711.html C#开发中常用的加密解密方法 相信很多人在开发过程中经常会遇到需要对一些重要的信息进行加密处理,今天 ...

  8. .NET中的DES对称加密

    DES是一种对称加密(Data Encryption Standard)算法,于1977年得到美国政府的正式许可,是一种用56位密钥来加密64位数据的方法.一般密码长度为8个字节,其中56位加密密钥, ...

  9. AES —— JAVA中对称加密和解密

    package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; impo ...

随机推荐

  1. Mysql数据库异常

    1. Mysql数据库异常 1.1. 数据库问题之Got error 28 from storage engine 原因首先检查磁盘是否已满,df -h一下 很可能是日志数据过大,查看该目录下文件夹和 ...

  2. log4j日志输出到日志文件中和控制台中 +log4j配置详解

    1.引入log4j的jar包 https://mvnrepository.com/,可以找到log4j的jar和依赖. 2.创建log4j.properties,并配置log4j #设置日志的级别 , ...

  3. 机器学习入门12 - 分类 (Classification)

    原文链接:https://developers.google.com/machine-learning/crash-course/classification/ 1- 指定阈值 为了将逻辑回归值映射到 ...

  4. Python - GUI(Graphical User Interface,图形用户界面)

    Tkinter https://docs.python.org/3/library/tkinter.html Python自带的标准GUI库,可用于快速创建GUI应用程序,能够满足基本的GUI程序要求 ...

  5. 吐血整理 20 道 Spring Boot 面试题,我经常拿来面试别人!

    面试了一些人,简历上都说自己熟悉 Spring Boot, 或者说正在学习 Spring Boot,一问他们时,都只停留在简单的使用阶段,很多东西都不清楚,也让我对面试者大失所望. 下面,我给大家总结 ...

  6. 8.python面向对象编程

    基本概念 Class 类一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.在类中定义了这些对象的都具备的属性(variables(data)).共同的方法 Object 对象 一个对象即是一个类的 ...

  7. 【原创】浅说windows下的中断请求级IRQL

    一 中断分类 根据中断源不同,可以将中断分为 硬件中断:硬件上产生的中断,可以来自处理器的内部和外部.处理器的外部中断可以来自各种PIN信号接口和Local APIC的LINT0和LINT1引脚,以及 ...

  8. Disconf源码分析之启动过程分析上(1)

    Disconf的启动,主要是包括两次扫描和XML非注解式配置,总共分为上下两篇,上篇先主要介绍第一次静态扫描过程. 先从入口分析,通过Disconf帮助文档,可以看到xml必须添加如下配置. < ...

  9. HBase 在人工智能场景的使用

    近几年来,人工智能逐渐火热起来,特别是和大数据一起结合使用.人工智能的主要场景又包括图像能力.语音能力.自然语言处理能力和用户画像能力等等.这些场景我们都需要处理海量的数据,处理完的数据一般都需要存储 ...

  10. easyui combobox 设置滚动条

    设置滚动条: 1 panelHeight:200  :设置固定的高度. 2 panelHeight:'auto', panelMaxHeight:200. <input class=" ...