继上一篇RSA对传输信息进行加密解密,再写个生成签名和验证签名。

  一般,安全考虑,比如接入支付平台时,请求方和接收方要互相验证是否是你,就用签名来看。

  签名方式一般两种,对称加密和非对称加密。对称加密就是双方互相有一个相同的key。非对称比如就是公钥和私钥。

  利用非对称openssl,下面是生成签名和验证签名的php示例。

  

<?php

$arrParams = array(
'z' => 1,
'a' => 2,
'n' => "hello",
'p' => "你好",
'c' => 0,
); $sortStr = createString($arrParams);// 有序生成字符串
// echo $sortStr;die; $sha = sha1($sortStr);// sha1生成摘要
// echo $sha;die; $private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQDKEquCt8WfdPFldkwy7GH3P274g4rxT2bFtaAlGKV03NVnZd/o
8+NvHyScilc4Awpp+xv0EJl25qI+OxoFjl0dGFXf8P4E93onPeZYfYtynTkhsFZv
CFYuf0GQW8o7M16d7WDeOKhyf9G/RWWTYYHwFO0uIPDXEgDHfLzf4NsZsQIDAQAB
AoGAUyLZQ19+Q/tl8Xt5IB5Ws9V6P25HNL6ZJtBxwbFhKTJN7ktgksP8l1Q1yN21
woqltzKjrodBzERZDcddDloi/kFCSj0I5rmnfMRifo8PLbv5+F9knxAyBc8Na52w
JLyv5+vqJM5cJ5OBxX055ipssQxBgno7OVJCgP8dY/EGnW0CQQDl9No8cmr3tha0
I9KPHbibwrwT9THBB5oGu3PUqTlBuJixjxGgf0pUm+qHw/r3PG1jNqD9Xx5REoQN
RrfQgLdPAkEA4PVjU8361m8weCUkm4jh/rsa8VYsiDEGCKEM6vmtaBYRlAXSeeb2
P/2MNlwI9bMSjiQ0q/XftHdSz4N+5/Le/wJBALDGBW4qVuiN5e4dC6RRKLU0gfil
qNXGzjUWrPhyDj3jdh4o6VgEAlQAd85ebfLZVQ3L1P5xvJB+N10tW+jAyikCQQCm
jAYlnXIAIAG6cYVQwV7PwKaJ1krR6bmV2eY+cOs5DF2nQUg6iAv4BDcyZ6EahqFO
Ku/z/+zHJzBgAfKKtvzxAkBeT86uZ6tfTNLR72UbP0abWKfE65cTNHGQZKp3Df79
Gx+UKVNiDHnfYmUu412QbpqDqi95XTDiPnry0fGqlzVJ
-----END RSA PRIVATE KEY-----';// 获取私钥 $pri_key_id = openssl_pkey_get_private($private_key);// 可用返回资源id Resource id
//var_dump($pri_key_id);die; $re = openssl_sign($sha, $signature, $pri_key_id, OPENSSL_ALGO_SHA1);
// var_dump($re);die; // $signature_base = base64_encode($signature); // 网络请求,post过去该base64字段,另一端解密
// echo $signature_base;die; // -----------------验签----------------
// 验签服务器拿到以上的参数(unset($signature)),同样生成有序串;sha1(); $public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDKEquCt8WfdPFldkwy7GH3P274
g4rxT2bFtaAlGKV03NVnZd/o8+NvHyScilc4Awpp+xv0EJl25qI+OxoFjl0dGFXf
8P4E93onPeZYfYtynTkhsFZvCFYuf0GQW8o7M16d7WDeOKhyf9G/RWWTYYHwFO0u
IPDXEgDHfLzf4NsZsQIDAQAB
-----END PUBLIC KEY-----';
$pu_key = openssl_pkey_get_public($public_key); $verify = openssl_verify($sha, $signature, $pu_key, OPENSSL_ALGO_SHA1);
if($verify == 1){
echo 'ok';
} else {
echo 'fail';
} /**
* @param $param
* @return bool|string
* 生成有序字符串
*/
function createString($param){
if (!is_array($param) || empty($param)){
return false;
}
ksort($param);
$concatStr = '';
foreach ($param as $k=>$v) {
$concatStr .= $k.'='.$v.'&';
}
$concatStr = rtrim($concatStr, '&');
return $concatStr;
}

  

openssl生成签名与验证签名的更多相关文章

  1. iOS使用Security.framework进行RSA 加密解密签名和验证签名

    iOS 上 Security.framework为我们提供了安全方面相关的api: Security框架提供的RSA在iOS上使用的一些小结 支持的RSA keySize 大小有:512,768,10 ...

  2. C#.NET RSA 私钥签名 公钥验证签名

    C#.NET RSA 私钥签名 公钥验证签名 公钥验签 1.待签名字符串转为byte数组时,一般使用UTF8. 2.将私钥字符串(PKCS8或PKCS1格式)转为C#.NET的RSACryptoSer ...

  3. php生成签名及验证签名

    <?php /** * 根据原文生成签名内容 * * @param string $data 原文内容 * * @return string * @author confu */ functio ...

  4. (8) openssl rsautl(签名/验证签名/加解密文件)和openssl pkeyutl(文件的非对称加密)

    rsautl是rsa的工具,相当于rsa.dgst的部分功能集合,可用于生成数字签名.验证数字签名.加密和解密文件. pkeyutl是非对称加密的通用工具,大体上和rsautl的用法差不多,所以此处只 ...

  5. iOS RSA加解密签名和验证

    转自:http://www.jianshu.com/p/81b0b54436b8 Pre:在公司负责了一个项目,需要用到iOS RSA验证签名的功能.后台给我的仅仅是一个公钥的字符串.经过起初的一段时 ...

  6. C#中RSA加密解密和签名与验证的实现

    RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔(Adi Shamir)和伦纳德•阿德曼(Le ...

  7. 【转】C#中RSA加密解密和签名与验证的实现

    [转]C#中RSA加密解密和签名与验证的实现 RSA加密算法是一种非对称加密算法.在公钥加密标准和电子商业中RSA被广泛使用.RSA是1977年由罗纳德•李维斯特(Ron Rivest).阿迪•萨莫尔 ...

  8. openssl 生成证书基本原理

    摘自:http://blog.csdn.net/oldmtn/article/details/52208747 1. 基本原理 公司一个项目要进行交易数据传输,因为这个项目银行那边也是刚刚开始启动,所 ...

  9. openssl生成密钥/证书

    一.公钥/私钥/签名/验证签名/加密/解密/非对称加密 对称加密:用同一个密码  加密/解密  文件. 非对称加密:加密用的一个密码,解密用另外一组密码. 加密解密:公钥加密数据,然后私钥解密. 公钥 ...

随机推荐

  1. 本地存储之sessionStorage

    源码可以到GitHub上下载! sessionStorage: 关闭浏览器再打开将不保存数据   复制标签页会连同sessionStorage数据一同复制 复制链接地址打开网页不会复制seession ...

  2. React 入门学习笔记整理(二)—— JSX简介与语法

    先看下这段代码: import React from 'react'; //最终渲染需要调用ReactDOM库,将jsx渲染都页面中 import ReactDOM from 'react-dom'; ...

  3. JS性能优化 之 事件委托

    面试中2次被问到过这个知识点,实际开发中,应用事件委托也比较常见.JS中事件委托的实现主要依赖于 事件冒泡 .那什么是事件冒泡?就是事件从最深的节点开始,然后逐步向上传播事件,举个例子:页面上有这么一 ...

  4. SAP MM 并非奇怪现象之MB5B报表查不到某一笔出库记录?

    物料号:1301002696 工厂代码:2160 MB5B,如下查询条件, 查询结果中,期初与期末库存数量都是0,期间的出库入库数量都是0.事实上该物料期初应该是有库存的.并且我用MB51相同时间段查 ...

  5. Loadrunner 脚本开发-从文件读取数据并参数化

    脚本开发-从文件读取数据并参数化 by:授客 QQ:1033553122   直接上代码: char* testfn() { int count, total = 0; //char buffer[1 ...

  6. 微信小程序-06-详解介绍.js 逻辑层文件-注册页面

    上一篇介绍的是 app.js 逻辑层文件中注册程序,对应的每个分页面都会有的 js 文件中 page() 函数注册页面 微信小程序-06-详解介绍.js 逻辑层文件-注册页面 宝典官方文档: http ...

  7. Django基础篇--用户权限管理和组管理

    Django作为一个成熟的python后台开发框架,为开发者提供了很多内置的功能,开发者只需要做一些配置就可以完成原生操作中比较复杂的代码编写.这些内置功能中其中一个比较强大的功能就是后台用户管理类. ...

  8. webrtc学习: 部署stun和turn服务器

    webrtc的P2P穿透部分是由libjingle实现的. 步骤顺序大概是这样的: 1. 尝试直连. 2. 通过stun服务器进行穿透 3. 无法穿透则通过turn服务器中转. stun 服务器比较简 ...

  9. JSON数据提取

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.JSON在数据交换中起到了一个载体的作用 ...

  10. Matplotlib:tick_params参数设置

    1.tick_params语法 参数:axis : {‘x’, ‘y’, ‘both’} Axis on which to operate; default is ‘both’.reset : boo ...