使用RSA进行信息加密解密的WebService示例
WebService采用的协议是SOAP,它基于HTTP,而HTTP是明文方式,也就是说,采用WebService传递的数据是明文的。如果是天气预报这种公开的只读信息的WebService无所谓,如果涉及写入或是和私密数据相关,那么明文传递就有很大的潜在危险性,必须加以遏止。
一般来说有两种方法,一是采用https加密的方式,另一种是用非对称加密算法对数据加密,下文提到的RSA就是第二种。
使用RSA对WebService传递的信息加密解密的基本思想是:服务器端提供一个WebService方法byte[] getServerPublicKey(),客户端可以以此得到服务器端的公钥,然后使用服务器端的公钥对要传出去的数据进行RSA加密,并附带以自己的公钥;服务器端得到客户端的请求后,先用自己的私钥解密客户端送来的数据,得到处理结果后用客户端提供的公钥加密,然后传回;客户端得到服务器端的返回数据后,用自己的私钥进行解密,最终得到了服务器端的真实数据。服务器端和客户端各自保存自己的RSA私钥用于解密,提供给对方RSA公钥进行加密,这样中间传递的信息就安全了。
加密解密示意顺序图:
下面是服务器端实现类的代码:
public class ServiceImpl implements IService{
@Override
public byte[] getResonse(byte[] params, byte[] clientPublicKey) {
try {
// 使用自己的私钥解密客户端用服务器端公钥加密的数据
String decryptString=SecurityUtil.getCoder().getDecryptString(params);
// 要返回的结果
String response="你好!"+decryptString;
// 使用客户端提供的公钥对返回的数据进行加密
byte[] retval=SecurityUtil.getCoder().getEncryptArray(response, clientPublicKey);
return retval;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public byte[] getServerPublicKey() {
return SecurityUtil.getCoder().getPublicKey();
}
}
客户端调用服务器端的代码:
import org.codehaus.xfire.XFireFactory;
import org.codehaus.xfire.client.XFireProxyFactory;
import org.codehaus.xfire.service.Service;
import org.codehaus.xfire.service.binding.ObjectServiceFactory;
public class Test {
public static void main(String[] args) {
Service srvcModel = new ObjectServiceFactory().create(IService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
String helloWorldURL = "http://localhost:8080/XfireSample/services/hello";
try {
IService srvc = (IService) factory.create(srvcModel, helloWorldURL);
// 得到服务器端的公钥
byte[] serverPublicKey=srvc.getServerPublicKey();
System.out.print("从服务器端得到的公钥为:");
for(byte b:serverPublicKey){
System.out.print(b);
}
System.out.println();
RSASecurityCoder coder=SecurityUtil.getCoder();
String requestString="世界";
// 使用服务器端的公钥对要传出去的数据进行加密
byte[] params=coder.getEncryptArray(requestString, serverPublicKey);
// 得到服务器端的返回结果
byte[] responseArray=srvc.getResonse(params, coder.getPublicKey());
// 使用自己的私钥进行解密
String responseString=coder.getDecryptString(responseArray);
System.out.println("从服务器端返回的字符串结果是:"+responseString);
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出的结果为:
从服务器端返回的字符串结果是:你好!世界
服务器端和客户端使用的RSA加密解密类代码:
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
/**
* RSA加密解密类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-1 下午06:14:38
* 修改时间:2010-12-1 下午06:14:38
*/
public class RSASecurityCoder{
// 非对称加密密钥算法
private static final String Algorithm="RSA";
// 密钥长度,用来初始化
private static final int Key_Size=1024;
// 公钥
private final byte[] publicKey;
// 私钥
private final byte[] privateKey;
/**
* 构造函数,在其中生成公钥和私钥
* @throws Exception
*/
public RSASecurityCoder() throws Exception{
// 得到密钥对生成器
KeyPairGenerator kpg=KeyPairGenerator.getInstance(Algorithm);
kpg.initialize(Key_Size);
// 得到密钥对
KeyPair kp=kpg.generateKeyPair();
// 得到公钥
RSAPublicKey keyPublic=(RSAPublicKey)kp.getPublic();
publicKey=keyPublic.getEncoded();
// 得到私钥
RSAPrivateKey keyPrivate=(RSAPrivateKey)kp.getPrivate();
privateKey=keyPrivate.getEncoded();
}
/**
* 用公钥对字符串进行加密
*
* 说明:
* @param originalString
* @param publicKeyArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:29:51
*/
public byte[] getEncryptArray(String originalString,byte[] publicKeyArray) throws Exception{
// 得到公钥
X509EncodedKeySpec keySpec=new X509EncodedKeySpec(publicKeyArray);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PublicKey keyPublic=kf.generatePublic(keySpec);
// 加密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.ENCRYPT_MODE, keyPublic);
return cp.doFinal(originalString.getBytes());
}
/**
* 使用私钥进行解密
*
* 说明:
* @param encryptedDataArray
* @return
* @throws Exception
* 创建时间:2010-12-1 下午06:35:28
*/
public String getDecryptString(byte[] encryptedDataArray) throws Exception{
// 得到私钥
PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(privateKey);
KeyFactory kf=KeyFactory.getInstance(Algorithm);
PrivateKey keyPrivate=kf.generatePrivate(keySpec);
// 解密数据
Cipher cp=Cipher.getInstance(Algorithm);
cp.init(Cipher.DECRYPT_MODE, keyPrivate);
byte[] arr=cp.doFinal(encryptedDataArray);
// 得到解密后的字符串
return new String(arr);
}
public byte[] getPublicKey() {
return publicKey;
}
public static void main(String[] arr) throws Exception{
String str="你好,世界! Hello,world!";
System.out.println("准备用公钥加密的字符串为:"+str);
// 用公钥加密
RSASecurityCoder rsaCoder=new RSASecurityCoder();
byte[] publicKey=rsaCoder.getPublicKey();
byte[] encryptArray=rsaCoder.getEncryptArray(str, publicKey);
System.out.print("用公钥加密后的结果为:");
for(byte b:encryptArray){
System.out.print(b);
}
System.out.println();
// 用私钥解密
String str1=rsaCoder.getDecryptString(encryptArray);
System.out.println("用私钥解密后的字符串为:"+str1);
}
}
用于初始化RSASecurityCoder实例的SecurityUtil类代码:
/**
* 信息安全实用类
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2010-12-2 上午10:57:49
* 修改时间:2010-12-2 上午10:57:49
*/
public class SecurityUtil{
// 用于加密解密的RSA编码类
private static RSASecurityCoder coder;
/**
* 初始化coder的静态构造子
*/
static{
try {
coder=new RSASecurityCoder();
} catch (Exception e) {
e.printStackTrace();
}
}
public static RSASecurityCoder getCoder() {
return coder;
}
}
您可以从http://www.box.net/shared/cyg98xgz78 获得上述代码涉及到的两个实例工程。
好了,感谢您看到这里,希望此文字没有耽误您太多宝贵时间。
使用RSA进行信息加密解密的WebService示例相关推荐
- 使用OpenSSL进行RSA加密和解密(非对称)
1. RSA加密和解密基础概念 RSA是一种非对称加密. RSA秘钥:私钥和公钥,一对私钥和公钥就像夫妻一样是唯一的,用私钥加密后必须用对应的公钥才能解密,用公钥加密后必须用对应的私钥才能解密. 加密 ...
- python RSA加密、解密、签名
python中用于RSA加解密的库有好久个,本文主要讲解rsa.M2Crypto.Crypto这三个库对于RSA加密.解密.签名.验签的知识点. 知识基础 加密是为了保证传输内容隐私,签名是为了保证消 ...
- rsa大数加密c语言,C语言:基于OpenSSL-RSA实现RSA非对称加解密
关于OpenSSL的介绍和安装在此不多赘述,可以在网上找到很多相关资料,各位感兴趣可以去了解下(自觉对OpenSSL开源库只是初级使用阶段,也就不在此"秀下限"了),直接进入主题, ...
- 加密解密_使用RSA密钥对加密解密数据
使用RSA密钥对加密解密数据 作者: 郭政鸿 2021/1/6 前言: 前几天看了非对称加密, 那非对称加密处理常见的https中的应用, 平时我们可以用来做什么呢? 1. 生成RSA密钥对 使用op ...
- javascript rsa java,用javascript与java执行
RSA加密与解密
用javascript与java执行 RSA加密与解密 2009-12-12 14:58:30 出处:https://www.yqdown.com 这几天一直做安全登录,网上查了好多资料,不尽如意 ...
- java rsa加密解密_前端实现对请求参数进行RSA加密amp;解密,针对字符串过长进行分段加密amp;分段解密的处理...
前言 在需求开发中,为了安全起见,我们都会难免遇到需要对一些敏感参数进行加密或者解密.所以,今天给大家分享的就是使用jsencrypt对请求参数进行RSA加密与解密,发这篇文章其实主要因为近期我的一位 ...
- GO语言实现RSA 加密和解密的实现
RSA 加密和解密的实现 openssl生成私钥 openssl genrsa -out rsa_private_key.pem 1024 openssl生成公钥 openssl rsa -in rs ...
- 跨语言平台的RSA加密、解密、签名、验证算法的实现
在网上可以找到各种各样的RSA实现代码,原理都是RSA算法的基本原理,但是在处理数据块划分.填充等问题上都是形形色色的,本文旨在探讨.实现遵循RFC 2313 PKCS#1 v1.5标准的一种跨语 ...
- RSA 公钥加密——私钥解密
作者:刘巍然-学酥 链接:http://www.zhihu.com/question/25912483/answer/31653639 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...
最新文章
- 输出类型SPER能自动删除公司间STO里的内向交货单?
- javascript设计模式-组合模式
- JQuery选择器——基本筛选选择器和内容筛选选择器
- 和煤一样的黑色矿石_煤精?黑琥珀?煤球一样的东西这么值钱!
- 钉钉小程序可以上传文件_怎样禁止钉钉外发文件?钉钉文件传输协议分析
- SD/MMC相关寄存器的介绍
- 单元测试中使用Mockito模拟对象
- qt linux下实现vlc视频,vlc音视频开发(一)环境搭建(qt篇)
- MySQL学习-排序与分组函数
- 视频编解码(七):profilelevel简介、ffmpeg如何控制profilelevel、编码效率
- Designing With Web Standard(一)
- svn创建分支和合并
- 识别电容、电阻的大小,那些电子元件上的103、104、105都是什么含义?
- Katalon Studio:一款静候你使用的免费自动化测试工具
- 转一篇Java基础的文章,比较有深度的,就转来收藏了
- 今天用Java开发主机IP扫描神器,零基础Socket编程详细
- 视频剪辑技巧,给每个视频添加不同背景图
- [Mysql] GROUP BY分组
- 【IT互联网行业内,什么岗位工作更有前景?】
- 58同城android客户端手机号码解密方法
热门文章
- 将svn 项目发布到服务器上,svn客户端将项目上传到服务器
- 什么是 Shell ?(超详细)
- linux php mkfifo,Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close() - 52php - 博客园...
- 池化层、感受野、空洞卷积、反卷积
- 第04课:学习:如何制定学习方案,获取进步捷径
- 如何处理因为支付成功后因延迟回调而订单被取消
- 秋季开学必备数码好物推荐,大学生开学必备电子产品推荐
- 微信员工会“偷看”用户聊天记录?张小龙万字回应来了!
- 十折交叉验证pythoniris_数据集的划分——交叉验证法
- 深度学习基础系列(十一)| Keras中图像增强技术详解