PHP与JAVA的签名与验签比较

java对应PHP SHA256 加 工具方法 java 对应 php 的 sha256 加工具 import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.PrivateKey; import java.sec... 阅读详情

往期精选(欢迎转发~~)

<?php
class RsaUtil {
	/**
	 * 获取签名
	 * @param string $strData 加密数据
	 * @param string $privateKey 私钥
	 * @return string $signature 签名
	 */
	static function sign($strData, $privateKey) {
		if (!openssl_get_privatekey($privateKey)) {
			echo 'encryptTaiping openssl_get_privatekey failed.';
			return false;
		}
		$signature = '';
		if (!openssl_sign($strData, $signature, $privateKey, OPENSSL_ALGO_SHA256)) {
			echo 'openssl_sign failed.';
			return false;
		}
		$signature = base64_encode($signature);
		return $signature;
	}
	
	/**
	 *
	 * RSA验签
	 * @param string $strData 验签数据
	 * @param string $signature 签名
	 * @return boolean true-成功 false-失败
	 */
	static function verify($strData, $signature, $publicKey) {
		if (!openssl_get_publickey($publicKey)) {
			echo 'verifyTaiping openssl_get_publickey failed.';
			return false;
		}
		$base64Signature = base64_decode($signature);
		if (!openssl_verify($strData, $base64Signature, $publicKey, OPENSSL_ALGO_SHA256)) {
			echo 'openssl_verify failed.';
			return false;
		}
		return true;
	}
}

$privateKey = '-----BEGIN RSA PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJXlLTA3tgArTApBu
KO9W8oIZq2p8AnZkx/6/2OCD/KMMRk7oUwev820ePBeT3J1IsKNsmgWLqsJ07J0SM
h/aVy7HBX6KPxueCilxa8yPFCdB0ZcLogFhN+2Rt6U0xGzRQ6WithR0XWZ6/aw4MX
xoioUzdkFGoExrsC/bTBLcWW3AgMBAAECgYAxVtJdALmDrLzG04M3QmkoQ0Oo/jro
wxlOeYv+8RzWtZaju6EIMUbpKvJ0DFcSUcQzTfjfkg2idwWbw/MBLA891mNO2P2qq
nKEq2leHlQN3PwH216nYfJ/24qiIi3lv1D9/H3QZ+qvq0e6m2gQMSbrAygPN3eNTY
3NUj6tqT2foQJBAPak9EiVZJ4wzD4KHGaC9rKWIst2j3Db5JBH2jsf73GI2yQcrZw
ceIR0mGREDxRA5VQkPw+YV63378ExwWSzgOsCQQCblLzRkIL5LtR6jb9rktoFqqlK
3K3nqTJs7sNCxZmgc14/EkGd42sLyi3kJhgdPHpqU9gmIZnoaAgCUIKyZFtlAkB9k
DSczxFOR2FzJAqZVYrqF+zW0CDuP8P4f9vlxbhMgHOvyrnHg+cG56S9Rri2guM9Fs
bT1aatdk+kdwQRlCDJAkA7WdViOLfOKXBDRFnWxtHHQaCNf3wUGPa0ma0BhvIhRIG
am/NOMRiACePR2jpuxMiKUWvut/jHsRAFGgOR3DkFAkAX6tPWaLK7vUPoydjX97y0
N5bPEaAyKhRn/U4IzoH8wgkbNQ+ktxZ8FLP5cUJOOlBtoCePbk52UexV4TqpZK++
-----END RSA PRIVATE KEY-----';
$publicKey = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCV5S0wN7YAK0wKQbijvVvKCGatqf
AJ2ZMf+v9jgg/yjDEZO6FMHr/NtHjwXk9ydSLCjbJoFi6rCdOydEjIf2lcuxwV+ij8
bngopcWvMjxQnQdGXC6IBYTftkbelNMRs0UOlorYUdF1mev2sODF8aIqFM3ZBRqBMa
7Av20wS3FltwIDAQAB
-----END PUBLIC KEY-----';

$textData = 'hello world!';
$strSignature = RsaUtil::sign($textData, $privateKey);
echo '签名:' . $strSignature . "\n";
$bolVerify = RsaUtil::verify($textData, $strSignature, $publicKey);
echo '验签:' . $bolVerify . "\n";

输出结果为:
  这里写图片描述
  
2 JAVA签名与验签
  下面在上java代码前,有个小问题需要说明一下,java程序中需要包含base64的jar库,该库可以在该地址下载:http://download.csdn.net/download/yx0628/5842065,具体导入jar库的方法,网上很多,我就不多介绍了,下面直接上代码:

import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import it.sauronsoftware.base64.Base64;

public class RsaUtil {
	//RSA签名 
	//text:待签名的数据,privateKeyData:第三方的私钥
	private static byte[] sign(final byte[] text, final byte[] privateKeyData) throws GeneralSecurityException {
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyData);
		KeyFactory keyFactory 		= KeyFactory.getInstance("RSA");
		PrivateKey privateKey 		= keyFactory.generatePrivate(keySpec);
		Signature signatureChecker 	= Signature.getInstance("SHA256WITHRSA");
		signatureChecker.initSign(privateKey);
		signatureChecker.update(text);
		return signatureChecker.sign();
	}
	
	//RSA验签名检查 
	//text:待签名数据,signedText:签名值,publicKeyData:开发商公钥
	private static boolean verify(final byte[] text, final byte[] signedText, final byte[] publicKeyData) throws GeneralSecurityException {
		X509EncodedKeySpec keySpec 	= new X509EncodedKeySpec(publicKeyData);
		KeyFactory keyFactory 		= KeyFactory.getInstance("RSA");
		PublicKey publicKey 		= keyFactory.generatePublic(keySpec);
		Signature signatureChecker 	= Signature.getInstance("SHA256WITHRSA");
		signatureChecker.initVerify(publicKey);
		signatureChecker.update(text);
		return signatureChecker.verify(signedText);
	}
	
	public static void main(String args[]) throws GeneralSecurityException, RuntimeException {
		String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJXlLTA3tgArTApBuKO9W8oIZq2p8AnZkx/6/2OCD/KMMRk7oUwev820ePBeT3J1IsKNsmgWLqsJ07J0SMh/aVy7HBX6KPxueCilxa8yPFCdB0ZcLogFhN+2Rt6U0xGzRQ6WithR0XWZ6/aw4MXxoioUzdkFGoExrsC/bTBLcWW3AgMBAAECgYAxVtJdALmDrLzG04M3QmkoQ0Oo/jrowxlOeYv+8RzWtZaju6EIMUbpKvJ0DFcSUcQzTfjfkg2idwWbw/MBLA891mNO2P2qqnKEq2leHlQN3PwH216nYfJ/24qiIi3lv1D9/H3QZ+qvq0e6m2gQMSbrAygPN3eNTY3NUj6tqT2foQJBAPak9EiVZJ4wzD4KHGaC9rKWIst2j3Db5JBH2jsf73GI2yQcrZwceIR0mGREDxRA5VQkPw+YV63378ExwWSzgOsCQQCblLzRkIL5LtR6jb9rktoFqqlK3K3nqTJs7sNCxZmgc14/EkGd42sLyi3kJhgdPHpqU9gmIZnoaAgCUIKyZFtlAkB9kDSczxFOR2FzJAqZVYrqF+zW0CDuP8P4f9vlxbhMgHOvyrnHg+cG56S9Rri2guM9FsbT1aatdk+kdwQRlCDJAkA7WdViOLfOKXBDRFnWxtHHQaCNf3wUGPa0ma0BhvIhRIGam/NOMRiACePR2jpuxMiKUWvut/jHsRAFGgOR3DkFAkAX6tPWaLK7vUPoydjX97y0N5bPEaAyKhRn/U4IzoH8wgkbNQ+ktxZ8FLP5cUJOOlBtoCePbk52UexV4TqpZK++";
		String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCV5S0wN7YAK0wKQbijvVvKCGatqfAJ2ZMf+v9jgg/yjDEZO6FMHr/NtHjwXk9ydSLCjbJoFi6rCdOydEjIf2lcuxwV+ij8bngopcWvMjxQnQdGXC6IBYTftkbelNMRs0UOlorYUdF1mev2sODF8aIqFM3ZBRqBMa7Av20wS3FltwIDAQAB";
		
		String textData = "hello world!";	
		byte[] base64PrivateKey = Base64.decode(privateKey.getBytes()); 
		byte[] base64PublicKey  = Base64.decode(publicKey.getBytes()); 
		
		byte[] signBytes = RsaUtil.sign(textData.getBytes(), base64PrivateKey);
		String strSignature = new String(Base64.encode(signBytes));
		System.out.println("签名:  " + strSignature);
		boolean bolVerify = verify(textData.getBytes(), signBytes, base64PublicKey);
		System.out.println("验签:  " + bolVerify);
    }
}

输出结果为(截取部分):
  这里写图片描述
  
3 比较
  两种语言生成的签名完全相同,但是生成签名和验签的过程中,有个明显的不同之处,即java进行签名和验签前,需要将key进行Base64.decode(),这个在php中不需要(我们用php,开始业务方给我们java的签名和验签示例时,看到java对key进行Base64.decode(),我以为php也需要对key进行相同处理,结果加密和验签一直失败)。然后对于签名和验签的算法,php中用到的是OPENSSL_ALGO_SHA256,对应的是java中的SHA256WITHRSA,这个需要自己查阅资料才能知道哈。

C++Java之RSA签名 最近一段时间一直被一个事情困扰:支付相关RSA签名验证签名,服务器使用java,客户端是c++的程序,在C++端验证签名的时候,试用了很多方法都无法签名通过。在java中,签名验证签名很容易调用现有的类实现,但是在c++中却是不太容易。      采用openssl原生的c++程序,不行;      在网上搜索了很久,也翻墙google了,试用了很多,也不行;      用了其他网友借鉴 阅读详情

相关推荐

openssl之RSA解码、

这几天在做支付

不曾观望,一直在路上 1820

签名算法PHPJava的不同实现

数字签名是密码学理论中的一个重要分支。它的提出是为了对电子文档进行签名,以 替代传统纸质文档上的手写签名,因此它必须具备 5 个特性。 (1)签名是可信的。 (2)签名是不可伪造的。 (3)签名是不可重用的。 (4)签名的文件是不可改变的。 (5)签名是不可抵赖的。 基于以上原因,我们要求请求我们的API时必须添加签名,以下分别是PHPJava发送请求的实例: PHP添加

ChinaHuanyang的专栏 3318

【Unity】NGUI下载导入

Unity3D插件NGUI的下载和导入。

Get your hands dirty 3万+

php java sha256withrsa 问题_php基于openssl函数的加密、解密、验证操作技巧

本文实例讲述了PHP实现超简单的SSL加密解密、验证签名的方法。分享给大家供大家参考,具体如下:1 sign签名代码:function sign($data) { //读取私钥文件 $priKey = file_get_contents('key/rsa_private_key.pem'); //转换为openssl密钥,必须是没有经过pkcs8转换的私钥 $res = open...

weixin_35607952的博客 849

php对接java现实加

我实现的方法,主要是把java生成的密钥转为php能识别的pem格式的密钥,其它的加采用调用openssl内置签名方法。 java生成的密钥主要是字符串;而pem格式密钥是以64位为一行,并且带有如下头和尾的文件格式,然后php再去取得相对应pem格式字符串。 pem格式密钥 -----BEGIN PUBLIC KEY----- //64chars一行(多行) -----EN

anyx的专栏 2917

php java 签名_JavaPHP签名问题(SHA256 with RSA算法)

OpenJDK 12 、PHP 7.3 测试交叉验证都通过。// 原文$data = '二〇二〇年四月四日 01:43:37';// 私钥$private = <<-----BEGIN RSA PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCow6pxwoAIFXWsZY3QMoUmB4uAYk0cA...

weixin_30387635的博客 1054

javaphp_php对接java现实加

我实现的方法,主要是把java生成的密钥转为php能识别的pem格式的密钥,其它的加采用调用openssl内置签名方法。java生成的密钥主要是字符串;而pem格式密钥是以64位为一行,并且带有如下头和尾的文件格式,然后php再去取得相对应pem格式字符串。pem格式密钥-----BEGIN PUBLIC KEY-----//64chars一行(多行)-----END PUBLIC KEY...

weixin_31258847的博客 109

PHP SHA1withRSA加密生成签名

最近公司对接XX第三方支付平台的代付业务,由于对方公司只有JAVA的demo,所以只能根据文档自己整合PHP签名加密,网上找过几个方法,踩到各种各样的坑,还好最后算是搞定了,话不多说,代码分享出来。 业务要求:每个签名组装的内容是按字段名的字典顺序升序排序连接的 先组装需要签名的内容: /** * 拼接需要签名的内容 * Author: Tao. * ...

TuiHo的鱼塘 3601

java/php/c#版rsa签名以及java实现

       在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一。由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本。譬如javaphp、c#。另外,在电子商务尤其是支付领域,对安全性的要求比较高,所以会采用非对称密钥RSA        本文主要介绍如何基于javaphp、c#在客户端使用rsa签名,然后在服务端使用Java。   基于...

海浪儿 553

PHP,C# 和JAVA RSA签名

JAVA签名: 1)从包含公私钥的pfx证书中取得.key私钥: Bat代码 F:\openssl-0.9.8k_WIN32\bin>opensslpkcs12-inf:\certs\zhuo.pfx-outf:\certs\zhuo.pem Enter...

chuangquan5932的博客 392

c java_javaphp无法通过

今天使用php写后端接口,对接使用的时java语言,使用php自己加时可以通过,当使用javaphp时一直无法通过,对比过公钥和私钥,都没有问题,加之后的信息完全一致,但php一直无法通过,都使用hello来php通过了,java未通过,打印拼接字符串,加之后字符串和调用接口的字符串,对比之后javaphp完全一致,但php可以通过,java未能通过。请求各位...

weixin_39605521的博客 331

支付宝 java 签名算法_(支付宝)签名

#签名更新时间:2017-06-13# [](https://docs.open.alipay.com/#%E8%AF%B7%E6%B1%82%E5%8F%82%E6%95%B0%E7%AD%BE%E5%90%8D)请求参数签名1. 筛选获取所有请求参数,不包括字节类型参数,如文件、字节流,剔除signsign\_type参数。2. 排序将筛选的参数按照第一个字符的键值ASCII码递增...

weixin_33132553的博客 3331

java rsa jar_php实现rsa签名

这两天在弄某支付接口相关的东西,以前没做过这块,在签名的过程中遇到了一些问题,记下来. 首先生成一个1024位的私钥: openssl genrsa -out private.pem 1024 然后根据私钥导出公钥 openssl rsa -in private.pem -pubout -out public.pem php的openssl扩这两天在弄某支付接口相关的东西,以前没做过这块,在...

weixin_39949954的博客 187

php对接java,PHP教程:php对接java现实加的实例

PHP教程:php对接java现实加的实例》要点:本文介绍了PHP教程:php对接java现实加的实例,希望对您有用。如果有疑问,可以联系我们。PHP教程java生成的密钥主要是字符串;而pem格式密钥是以64位为一行,并且带有如下头和尾的文件格式,然后php再去取得相对应pem格式字符串.PHP教程pem格式密钥PHP教程-----BEGIN PUBLIC KEY-----//64...

weixin_31208627的博客 425

java中加实例详解_php对接java现实加的实例

本篇文章主要介绍php对接java现实加的实例,感兴趣的朋友参考下,希望对大家有所帮助。我实现的方法,主要是把java生成的密钥转为php能识别的pem格式的密钥,其它的加采用调用openssl内置签名方法。java生成的密钥主要是字符串;而pem格式密钥是以64位为一行,并且带有如下头和尾的文件格式,然后php再去取得相对应pem格式字符串。pem格式密钥-----BEGIN PU...

weixin_31969199的博客 275

跨平台rsa签名

本文主要讲java和python平台的rsa签名java使用的是16进制密钥,python使用的是pkcs8编码格式的密钥,其原理其他平台也可以参考。

猪头三 2311

java/php/c#版rsa签名以及java实现openssl生成

原文:http://blog.csdn.net/zaocha321/article/details/52221316 在开放平台领域,需要给isv提供sdk,签名是Sdk中需要提供的功能之一。由于isv使用的开发语言不是单一的,因此sdk需要提供多种语言的版本。譬如javaphp、c#。另外,在电子商务尤其是支付领域,对安全性的要求比较高,所以会采用非对称密钥RSA        本文主要介

adsadadaddadasda的博客 619

PHP,C# 和JAVARSA签名

这个功能网上搜了好多资料。贡献一下,转载须注明并对卓二妹的无私奉献表示感谢。 1)签名算法使用SHA1withRSA。 2)签名后的数据位base64编码的密文字符串。 3)三个环境进行签名的私钥的格式不同,需要openssl工具进行转换。 —————————————————————————————————————————— JAVA签名: 1)从包含公私钥的pfx证书中取得.ke...

写代码的二妹 451

c java_php对接java现实加的实例

php对接java现实加的实例发布于 2017-08-03 14:37:06 | 89 次阅读 | 评论: 0 | 来源: 网友投递PHP开源脚本语言PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适用于Web开发领域。PHP的文件后缀名为ph...

weixin_33229152的博客 191

复现Fastjson反序列化漏洞(从dnslog回显到rce再到反弹shell)

Fastjson是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。......

记录并分享学习安全的知识点.. 2645

基于stm32单片机设计的简易激光雕刻机(原理图、PCB图、源代码、上位机)

基于stm32单片机设计的简易激光雕刻机(原理图、PCB图、源代码、上位机)该系统主控为STM32f103c8t6,该芯片属于性价比比较高的;雕刻的信息由上位机通过wifi传输给下位机;雕刻机的架子有废旧的光驱改装完成,激光头在某宝上淘的,这个激光头也可以用废旧光驱的激光头,没有做这个。板子是自己画的,由于画的双层的板子就没有去自己制作电路板了,直接发给PCB厂打板了,机子的架子使用的是亚克力板子,这个就比较戳了,自己一刀一刀划出来然后粘的

上一篇: C盘瘦身C盘瘦身
下一篇: 通过PHP读取wav音频时长
楼仔
博客等级 码龄14年 146粉丝 138原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值