签名校验的好处
(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//");
}
}
-- 待续