通过java分析数字签名校验

签名校验的好处

    (1.)签名可以证明对应请求的发起者。只有发起者才有对应的私有秘钥,因此,只有发起者才能计算出这些校验的和。效验和就像发起者的签名一样。

    (2.)签名可以防止报文被篡改。如果有恶意攻击者在报文传输的过程中对其就行了修改,效验就不在匹配了。由于效验和只有请求者持有的私有秘钥才能产生,所以攻击者无法为篡改了的报文伪造出正确的验证码。

1.首先生成公钥和秘钥

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
public class GenerateKeyPair {
    private static final char[] bcdLookup = { '0', '1', '2', '3', '4', '5',
			'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
    public void run(String path) {
        try {
            //首先获取秘钥生成器实例(RAS算法)
            KeyPairGenerator keygen = KeyPairGenerator.getInstance("RSA");
  
            /**
            * 初始化确定密钥大小的密钥对生成器,使用默认的参数集合,并使用以最高优先级安
            * 装的提供者的securerandom 实现作为随机源。(如果任何安装的提供者都不提供
            * securerandom 的实现,则使用系统提供的随机源。)
            */
            SecureRandom secrand = new SecureRandom();
            keygen.initialize(1024, secrand);

            //动态生成密钥对,这是当前最耗时的操作,一般要2s以上。
            KeyPair keys = keygen.generateKeyPair();
            //公钥获取
            PublicKey pubkey = keys.getPublic();
            //私钥钥获取
            PrivateKey prikey = keys.getPrivate();

            /**
            * 公钥和私钥都有它们自己独特的比特编码,可以通过getEncoded()方法获取,
            * 返回类型为byte[]。通过byte[]可以再度将公钥或私钥还原出来。具体代码如下:
            */
            byte[] publicKeyData = pubkey.getEncoded();
            byte[] privatekeyData = prikey.getEncoded();

            //将byte[]转换成十六进制字符串
            String pubKey = bytesToHexStr(publicKeyData);
            String priKey = bytesToHexStr(privatekeyData);

            //写入文件
            writeFile(pubKey, path, "public.key");
            writeFile(priKey, path, "private.key");
            System.out.println("写入对象 pubkeys ok");
            System.out.println("生成密钥对成功");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

    }

    public String bytesToHexStr(byte[] bcd) {
        StringBuilder s = new StringBuilder(bcd.length * 2);
        for (byte i : bcd) {
            s.append(bcdLookup[(i >>> 4) & 0x0f]);
            s.append(bcdLookup[i & 0x0f]);
        }
        return s.toString();
    }

    private void writeFile(String key, String path, String fileName) {
        File folder = new File(path);
        File file = new File(path + "/" + fileName);
        FileOutputStream fos = null;
        try {
            if(!folder.exists()){
                folder.mkdirs();
            }
            if (!file.exists()) {
                file.createNewFile();
            }
            fos = new FileOutputStream(file);
            fos.write(key.getBytes());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (fos != null) {
                    fos.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args){
        GeneratekeyPair generate = new GeneratekeyPair();
        generate.run("D://keys//");
    }
 }
-- 待续

猜你喜欢

转载自blog.csdn.net/weixin_39032575/article/details/81009989