在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);          // 输出结果
}

个人公众号

原文地址:https://www.cnblogs.com/zerofc/p/9130096.html

时间: 2024-11-08 21:14:42

在php中使用对称加密DES3,开发银行卡绑定,实名验证……的相关文章

JAVA中AES对称加密和解密

AES对称加密和解密 package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Ba

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

package demo.security; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.util.Base64; impor

公钥密码学中的素数以及对称加密

密码学,一向被人们认为门槛很高,特别高端...这也是实际,但是这决不意味着普通人无法了解它的精髓,对于喜欢画圆的人来讲,即便是理解了密码技术背后的哪怕一点理论,也是激动人心的. 声明和悲叹 最近,一次联调SSLVPN协议的机会,让我终于有时间可以弄点关于密码学的东西,只是简单的沾个边儿,因此本文既不是技术文档亦非学术论文,你不可能通过阅读本文学到Howto,这只是一篇随笔或者说科普,而已. 声明之后是我的一些悲叹! 有太多人精通加密算法,却不了解群环域的实质,反对者声称只要会用只要懂操作步骤就可

Android 中 非对称(RSA)加密和对称(AES)加密

在非对称加密中使用的主要算法有:RSA.Elgamal.背包算法.Rabin.D-H.ECC(椭圆曲线加密算法)等. 优点: 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解.而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥 比如: 做登陆功能的时候为了数据安全,需要对密码进行加密,这时候可以使用非对称加密, 首先通过后台提供的接口获取公钥,

HTTPS中的对称密钥加密,公开密钥加密,数字证书

HTTPS中的对称密钥加密,公开密钥加密,数字证书 密钥 我们将未加密的内容称为明文,加密之后的内容称为密文. 简单来说,要加密一段明文,可以将这段内容输入到一个加密函数中,输出密文.但这种简单的加密方式存在被人盗取到加密函数从而破解明文的危险,且加密函数一般构成复杂,一旦被盗取更换成本较高. 于是人们想出了一个办法,在加密函数中再添加一个参数,这个参数只有通信双方知道,没有参数则无法正确解密出密码.这个参数被称为密钥.对于同一个加密函数而言,密钥值的不同则加密方式也不同,得出的密文也就不同.这

对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

对称加密和分组加密中的四种模式(ECB.CBC.CFB.OFB) 一. AES对称加密: AES加密 分组 二. 分组密码的填充 分组密码的填充 e.g.: PKCS#5填充方式 三. 流密码:   四. 分组密码加密中的四种模式: 3.1 ECB模式 优点: 1.简单: 2.有利于并行计算: 3.误差不会被传送: 缺点: 1.不能隐藏明文的模式: 2.可能对明文进行主动攻击: 3.2 CBC模式: 优点: 1.不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL.IPSec的标准.

php中des加密解密&#160;匹配C#des加密解密&#160;对称加密

原文:php中des加密解密 匹配C#des加密解密 对称加密 网上找来的 php des加密解密 完全匹配上一篇C# 字符串加密解密函数  可以用于C#和php通信 对数据进行加密,其中$key 是加密密钥,$iv 是偏移量,默认偏移量和加密密匙是一样的, <?php class DES { var $key; var $iv; //偏移量 function DES( $key, $iv=0) { //key长度8例如:1234abcd $this->key = $key; if( $iv

三重Des对称加密在Android、Ios 和Java 平台的实现

引言 如今手机app五彩缤纷,确保手机用户的数据安全是开发人员必须掌握的技巧,下面通过实例介绍DES在android.ios.java平台的使用方法: DES加密是目前最常用的对称加密方式,性能优于非对称加密(RSA),是手机app请求数据加密的优先选择.   DES简介: DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法, 算法的入口参数有三个:Key.Data.Mode. Key:为7个字节共56位,是DES算法的工作密钥; Data:

浅谈 PHP 中的多种加密技术及代码示例

信息加密技术的分类 单项散列加密技术(不可逆的加密) 属于摘要算法,不是一种加密算法,作用是把任意长的输入字符串变化成固定长的输出串的一种函数 MD5 string md5 ( string $str [, bool $raw_output = false ] ); //MD5加密,输入任意长度字符串返回一个唯一的32位字符 md5()为单向加密,没有逆向解密算法,但是还是可以对一些常见的字符串通过收集,枚举,碰撞等方法破解;所以为了让其破解起来更麻烦一些,所以我们一般加一点盐值(salt)并双