PHP与JAVA的签名与验签比较
发布日期:2021-10-05 13:28:31 浏览次数:2 分类:技术文章

本文共 3858 字,大约阅读时间需要 12 分钟。

  最近在做一个项目,由于我们的开发语言是php,业务方的语言是java,进行签名和验签时两边需要保持一致,这就要求两边的签名和验签方法完全相同,摸索了一天,总算是明白两种开发语言在该知识点上的不同之处。

  
1 PHP签名与验签
  首先直接上php代码,代码已经经过验证,可以直接运行,如下:

  输出结果为:

  这里写图片描述
  
2 JAVA签名与验签
  下面在上java代码前,有个小问题需要说明一下,java程序中需要包含base64的jar库,该库可以在该地址下载:,具体导入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,这个需要自己查阅资料才能知道哈。
  

转载地址:https://blog.csdn.net/lml200701158/article/details/52745414 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:通过PHP读取wav音频时长
下一篇:C盘瘦身

发表评论

最新留言

很好
[***.229.124.182]2024年03月28日 15时06分46秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

POJ 1125 Stockbroker Grapevine 弗洛伊德算法 2021-06-29
UVA-512 Spreadsheet Tracking【STL大法好】+(带你了解Vector相关方法+模板归纳) 2021-06-29
C++ 【蓝书】网络流问题(网络流基础概念+三个算法+做题时的选择+模板整合)【网络流从入门到放弃】 2021-06-29
HDU 2809 God of War 【DP+状态压缩】 (战神吕布打怪升级+状态压缩详解+模板嵌套+二进制画图分析) 2021-06-29
C++ 【蓝书】网络流问题(例题HDU 1532+三个算法+做题时的选择+模板整合)【网络流从入门到放弃】 2021-06-29
C++ HNUCM-OJ 最大字段和相关问题 【模板归纳】+(求出最大子段和,以及子段的起始位置和结束位置 )+(时间复杂度O( n)) 2021-06-29
轻松保存扣扣闪照!是的,闪照保存!很简单!学不会扣眼珠子! 2021-06-29
ATM机等待时间详细代码和解释 2021-06-29
我在pip安装tensorflow时遇到 ERROR: Cannot uninstall ‘wrapt‘. It is a distutils installed project and thu2 2021-06-29
tensorfolw很多的函数不能使用,具体解决方法: 2021-06-29
html静态网页实例一(附完整代码) 2021-06-29
html静态网页实例二(附完整代码) 2021-06-29
Turtle入门一 2021-06-29
爬取去哪儿网酒店信息 2021-06-29
C++判断素数详细讲解与代码 2021-06-29
C++求阶层和 2021-06-29
pygame安装问题 2021-06-29
python画一个可爱的皮卡丘(完整代码) 2021-06-29
Python编程实现BP算法,在西瓜数据集上训练一个单隐层网络(方法一,四个方法,我四篇发布,附完整代码和数据集,) 2021-06-29
Python编程实现BP算法,在西瓜数据集上训练一个单隐层网络(方法二,附带完整代码) 2021-06-29