RSA算法实现传输数据的签名

在不同服务器或系统之间进行交互时我们往往需要进行身份的认证,以满足安全上的防抵赖和防篡改。

要实现以上要求使用非对称加密算法是目前最理想的方案。

以下是具体的实现:

1. 生成RSA算法私钥和公钥对,用openssl(openssl的安装网上有很多资料,可以自行查看)

生成RSA私钥

openssl>genrsa -out rsa_private_key.pem 1024

生成RSA公钥

openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

将RSA私钥转换成PKCS8格式

openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt

2. 私钥由请求方系统妥善保管,不能泄漏;公钥交由系统的响应方用于验证签名

3. 请求方使用私钥对发送的请求进行签名,具体的实现方法如下(JAVA)

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 org.apache.commons.codec.binary.Base64;

public String sign(String data, String privateKey) {
    String result = "";
    byte[] keyBytes = Base64.decodeBase64(privateKey);
    PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
    try{
    KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
    PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);
    Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
    signature.initSign(priKey);
    signature.update(data.getBytes());
    result = (new Base64()).encodeAsString(signature.sign());
    }catch(Exception ex){
        throw new ServiceException(ex);
    }
    return result;
}

4. 响应方的系统对请求数据验证签名

public boolean verify(String data, String publicKey, String sign) {
    boolean result;
    byte[] keyBytes = Base64.decodeBase64(publicKey);

    X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
    KeyFactory keyFactory;
    try {
        keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PublicKey pubKey = keyFactory.generatePublic(keySpec);

        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(pubKey);
        signature.update(data.getBytes());
        result = signature.verify((new Base64()).decode(sign));
    } catch (Exception ex) {
        throw new RuntimeException(ex);
    }

    return result;
}
时间: 2024-12-14 04:21:06

RSA算法实现传输数据的签名的相关文章

springmvc使用RSA算法加密表单

今天被吐槽在客户端用js对密码进行md5加密其实也不见得安全.这种做法其实不见得有什么作用,学过计算机网络都知道,在网上抓一个包是很简单的事,就算别人抓包抓不到你原始密码,用这个md5后的密码一样可以模拟登录系统.这样做无非就是直接通过登录页没法直接输入用户名密码,但用个程序模拟登陆也不是什么太难的事情.以前一直写那么多,一直没有注意,直到今天被吐槽,才发现以前自己的做法是多么的幼稚. 加密数据的方式当然不止一种,也可以通过https加密数据,但是对于一般应用来说,还需要花钱拿去给那些认证机构签

这个发现是否会是RSA算法的BUG、或者可能存在的破解方式?

笔者从事各种数据加解密算法相关的工作若干年,今天要说的是基于大数分解难题的RSA算法,可能有些啰嗦. 事情的起因是这样的,我最近针对一款芯片进行RSA CRT解密的性能优化.因为期望值是1024bits长度能做到20ms左右,但我的实现结果接近40ms.为了找到更加快速的实现方式,我在各大论坛查找不基于Jebelean和Montgomery的模乘实现.在查找过程中非常偶然的获得了一组密钥数据,现在按照一般生成密钥的顺序,先对该组数据简单说明一下,证明其正确性. 1. 密钥产生过程 选取两个512

跨越千年的RSA算法

跨越千年的RSA算法 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的思维游戏中.直到计算机诞生之后,几千年来的数论研究成果突然有了实际的应用,这个过程可以说是最为激动人心的数学话题之一.最近我在<程序员>杂志上连载了<跨越千年的 RSA 算法>,但受篇幅限制,只有一万字左右的内容.其实,从数论到 RSA 算法,里面的数学之美哪里是一万字能扯完的?在写作的过程中,我查了很多资料,找到了很多漂亮的例子,也积累了很多个人的思考

浅谈IM软件业务知识——非对称加密,RSA算法,数字签名,公钥,私钥

概述 首先了解一下相关概念:RSA算法:1977年由Ron Rivest.Adi Shamirh和LenAdleman发明的.RSA就是取自他们三个人的名字. 算法基于一个数论:将两个大素数相乘很easy,但要对这个乘积的结果进行 因式分解却很困难,因此可以把乘积公开作为公钥.该算法可以抵抗眼下已知的全部password攻击. RSA算法是一种非对称算法,算法须要一对密钥.使用当中一个 加密.须要使用另外一个才干解密.我们在进行RSA加密通讯时.就把公钥放在client,私钥留在server.

RSA算法解析

RSA是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但RSA的安全性一直未能得到理论上的证明.它经历了各种攻击,至今未被完全攻破. 它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman.但RSA的安全性一直未能得到理论上的证明

转:RSA算法原理说明

转:http://www.joenchen.com/archives/979 RSA算法可以说在我们使用计算机的每一方面都在发挥着作用, EXE文件的签名算法用的是SHA1 + RSA. 我们每天登陆网银, 使用QQ 无时不刻都在使用着RSA算法. 发明这算法的人, 真心牛逼. 搞这种算法才知道, 数学基础是那么的重要. 尼玛, 以前老师教的时候, 为什么不这样说. 不如是的告诉我们. 工作以后才发现, 在计算机领域数学是必备的学科, 数学学的是否良好. 直接关系到在计算机领域能够专研的深度.

RSA算法原理1

必备数学知识 RSA加密算法中,只用到素数.互质数.指数运算.模运算等几个简单的数学知识.所以,我们也需要了解这几个概念即可. 素数 素数又称质数,指在一个大于1的自然数中,除了1和此整数自身外,不能被其他自然数整除的数.这个概念,我们在上初中,甚至小学的时候都学过了,这里就不再过多解释了. 互质数 百度百科上的解释是:公因数只有1的两个数,叫做互质数.:维基百科上的解释是:互质,又称互素.若N个整数的最大公因子是1,则称这N个整数互质. 常见的互质数判断方法主要有以下几种: 两个不同的质数一定

RSA算法 Android JAVA C#互通

RSA算法属非对称加密算法,在实际使用中,往往客户端使用公钥进行加密传递敏感数据,服务端server使用私钥进行解密,这样防止中间人从网络获取敏感数据的明文. Android端主要代码如下: 1 package com.example.rsatest; 2 3 import java.io.UnsupportedEncodingException; 4 import java.math.BigInteger; 5 import java.security.KeyFactory; 6 import

前端加密数据后台解密之RSA算法实现

1.概述 前端时间与前端人员配合开发一款移动端WEB-APP,在各种因素的限制下,数据的安全性,让我为难,目前最可行和最直接的方式就是对所有用户敏感数据进行加密处理,然后传输到后端,解析处理.事先我尝试fiddler工具,拦截了APP所有的请求,结果发现不得不做安全处理了,至少先对这些数据加密处理.本文将讲述如何使用前端加密后端解密的过程,以及途中遇到的问题,如何解决. 2.选择加密算法 由于前端各种数据很容易被其他人获取,自然而然的选择的非对称加密,个人选择的是RSA算法.在确定好算法之后.最