jsrsasign 前台签名,Java后台验证前台签名

rsa  具体是什么  这个就不在多说。算法实现啊应用啊 已经有很多了。今天记录下 这种特殊的需求,前台签名,后台验证

Java后台产生 密匙对

pom.xml 添加BC 依赖

 <dependency>
            <groupId>org.bouncycastle</groupId>
            <artifactId>bcprov-jdk15on</artifactId>
            <version>1.51</version>
        </dependency>

RSATools

package com.oscgc.securevideo.server.tool.rsa;

import java.io.IOException;
import java.io.StringWriter;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import org.bouncycastle.openssl.PEMWriter;
import org.bouncycastle.util.io.pem.PemObject;

/**
 * Created by Yq on 2015/6/10.
 */
public class RsaKeyTools {

    public static final String PEM_PUBLICKEY = "PUBLIC KEY";

    public static final String PEM_PRIVATEKEY = "PRIVATE KEY";

    /**
     * generateRSAKeyPair
     *
     * @param keySize
     * @return
     */
    public static KeyPair generateRSAKeyPair(int keySize) {
        KeyPairGenerator generator = null;
        SecureRandom random = new SecureRandom();
        Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
        try {
            generator = KeyPairGenerator.getInstance("RSA", "BC");
        }
        catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        catch (NoSuchProviderException e) {
            e.printStackTrace();
        }

        generator.initialize(keySize, random);

        KeyPair keyPair = generator.generateKeyPair();

        return keyPair;
    }

    /**
     * convertToPemKey
     *
     * @param publicKey
     * @param privateKey
     * @return
     */
    public static String convertToPemKey(RSAPublicKey publicKey,
                                         RSAPrivateKey privateKey) {
        if (publicKey == null && privateKey == null) {
            return null;
        }
        StringWriter stringWriter = new StringWriter();

        try {
            PEMWriter pemWriter = new PEMWriter(stringWriter, "BC");

            if (publicKey != null) {

                pemWriter.writeObject(new PemObject(PEM_PUBLICKEY,
                                                    publicKey.getEncoded()));
            }
            else {          //此处产生的privatekey 的格式是 PKCS#8 的格式
                pemWriter.writeObject(new PemObject(PEM_PRIVATEKEY,
                                                    privateKey.getEncoded()));
            }
            pemWriter.flush();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return stringWriter.toString();
    }

    public static byte[] sign(String data, byte[] privateKey) throws Exception {
        PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKey);

        KeyFactory keyFactory = KeyFactory.getInstance("RSA");

        PrivateKey privateKey2 = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
        Signature signature = Signature.getInstance("SHA1WithRSA");
        signature.initSign(privateKey2);
        signature.update(data.getBytes());
        return signature.sign();

    }
    //后台测试签名的时候 要和前台保持一致,所以需要将结果转换
    private static String bytes2String(byte[] bytes) {
        StringBuilder string = new StringBuilder();
        for (byte b : bytes) {
            String hexString = Integer.toHexString(0x00FF & b);
            string.append(hexString.length() == 1 ? "0" + hexString : hexString);
        }
        return string.toString();
    }

    public static boolean verify(String data,
                                 byte[] publicKey,
                                 byte[] signatureResult) {
        try {
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKey);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            PublicKey publicKey2 = keyFactory.generatePublic(x509EncodedKeySpec);

            Signature signature = Signature.getInstance("SHA1WithRSA");
            signature.initVerify(publicKey2);
            signature.update(data.getBytes());

            return signature.verify(signatureResult);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
        //前台的签名结果是将byte 中的一些 负数转换成了正数,    //但是后台验证的方法需要的又必须是转换之前的
    public static byte[] hexStringToByteArray(String data) {
        int k = 0;
        byte[] results = new byte[data.length() / 2];
        for (int i = 0; i + 1 < data.length(); i += 2, k++) {
            results[k] = (byte) (Character.digit(data.charAt(i), 16) << 4);
            results[k] += (byte) (Character.digit(data.charAt(i + 1), 16));
        }
        return results;
    }

    public static void main(String[] args) {
        String str = "coder";
        KeyPair k = generateRSAKeyPair(1024);

        String publicKey = convertToPemKey((RSAPublicKey) k.getPublic(), null);
        String privateKey = convertToPemKey(null,
                                            (RSAPrivateKey) k.getPrivate());

        System.out.println("publicKey__\n" + publicKey);
        System.out.println("privateKey_\n" + privateKey);

        try {
            byte[] signautreResult = sign(str, k.getPrivate().getEncoded());
            String signatureStr = bytes2String(signautreResult);
            byte[] signatureResult2 = hexStringToByteArray(signatureStr);

            boolean b = verify(str,
                               k.getPublic().getEncoded(),
                               signatureResult2);
            System.out.print("iii   " + b);
        }
        catch (Exception e) {
            e.printStackTrace();
        }

    }

}

Javascript    签名用到的lib 是 jsrsasign  包含:

更多的详细  github 地址:https://kjur.github.io/jsrsasign/

在官网给定的签名例子代码如下:

function doSign() {
  var rsa = new RSAKey();
  rsa.readPrivateKeyFromPEMString(document.form1.prvkey1.value);
  var hashAlg = document.form1.hashalg.value;
  var hSig = rsa.signString(document.form1.msgsigned.value, hashAlg);
  document.form1.siggenerated.value = linebrk(hSig, 64);
}

这里我们需要改动一下:

 rsa.readPrivateKeyFromPEMString(document.form1.prvkey1.value);

官方api 中对这个方法有这样的说明:

readPrivateKeyFromPEMString(keyPEM)

read PKCS#1 private key from a string

这个方法传入的privatekey 是需要 PKCS#1 格式的,但是后台 产生出来的private key 是PKCS#8的格式的,这里就不能用这个方法,签名会通不过。

查看jsrsasign 的 api

KEYUTIL - loading RSA/EC/DSA private/public key from PEM formatted PKCS#1/5/8 and X.509 certificate

因此 js  生成RSAkey  对象

 rsa=KEYUTIL.getKey(document.form1.prvkey1.value);

这个方法支持PKCS#8 pem 格式的privatekey  可以通过签名。

时间: 2024-08-01 18:46:33

jsrsasign 前台签名,Java后台验证前台签名的相关文章

Java 后台验证的工具类

Java 后台验证的工具类 public class ValidationUtil {         //手机号     public static String mobile = "^((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(17[0-9])|(18[0-9])|(19[0-9]))\\d{8}$";       //不允许为空     public static String blank = ".*[^ ].*";  

rsa实现js前台加密java后台解密

前段时间咱老大吩咐我写一个rsa前台加密到后台用java解密.(说实话这之前我还真没用过) 不过没办法啊,这是任务,于是研究了一下.圆满完成任务了,下面共享下实现思路: 准备工作:其实鄙人也没那么强啦,第三方包是必须的 bcprov-jdk15on-148.jar commons-codec-1.7.jar commons-lang-2.4.jar log4j-1.2.15.jar slf4j-api-1.6.1.jar package com.web.utils; import java.io

支付宝APP支付,Java后台生成的签名的过程

/** *支付宝支付 * @param orderId 订单编号 * @param actualPay 实际支付金额 * @return */ private String getOrderInfoByAliPay(String orderId,float actualPay) { //回调页面 String ali_call_back_url = propertiesService.ALI_CALL_BACK_URL; String seller_id = propertiesService.

JS前台加密,java后台解密实现

因项目需求,需要对用户信息进行加密(以登录为例),前台js中对用户名密码进行加密传输. 然后后台进行解密操作 先看一下效果图 未对其加密传输 对其加密传输 从以上可以看出如果不对其进行加密的话,用户的一些敏感信息将会被捕捉到 1.前台JS <script type="text/javascript"> $(function() { $("#btn").click(function() { var username = encode64($("#

asp.net调用前台js调用后台代码分享

C#前台js调用后台代码 前台js <script type="text/javascript" language="javascript"> function Ceshi() { var a = "<%=Getstr()%>"; alert(a); } </script> <input type="button" onclick="Ceshi();" value=

RSA后台签名前台验签的应用(前台采用jsrsasign库)

写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验签的应用>. 我这里所谓的返给前台的数据只是想加密用户验证通过与否的字段success是true还是false, 前台拿这个success作为判断依据进行下一步的操作, 是进一步向后台发起请求还是直接弹出错误消息.照测试结果看这是个逻辑漏洞, 即使后台返回的是false, 在返回前台的过程中响应包被劫获

关于使用JS前台加密、JAVA后台解密的RSA实现,RSA加密和签名

需求环境: 西安项目中,客户要求保护用户的密码信息,不允许在http中传递明文的密码信息. 实现: 用RSA非对称加密方式实现.后台生成rsa密钥对,然后在登陆页面设置rsa公钥,提交时用公钥加密密码,生成的密文传到后台,用私钥解密,获取密码明文. 这样客户端只需要知道rsa加密方式和公钥,前台不知道私钥是无法解密的,此解决方案还是相对比较安全的. 附件是参照网友资料的java+JS的实现,放在这里供大家下载.访问方式/RSA/login.jsp. 需要到http://www.bouncycas

敏捷自动化单元测试 (从前台 JavaScript 至后台 Java)

此份材料的内容适用于前台 JavaScript 与后台 Java 的单元测试? 希望, 能协助开发人员可在最短的时间内, 开展单元测试的工作? 附件: 敏捷自动化单元测试 样例代码: QUnit 样例代码: jstd 样例代码: jsmine 样例代码: Java 黑盒单元测试

.Net MVC 前台验证跟后台验证

前台验证: 首先你得有一个参数类,参数类代码如下 验证标记总结 [DisplayName("邮箱:")]        [Required(ErrorMessage = "请输入您的邮箱")]        [RegularExpression(@"^(\w-*\.*)[email protected](\w-?)+(\.\w{2,})+$",ErrorMessage ="请输入正确的邮箱")]        public s