您的当前位置:首页正文

JSON接口如何实现RSA非对称加密与签名

2022-09-22 来源:年旅网
JSON接⼝如何实现RSA⾮对称加密与签名

⼀、概述

1、 数字签名的作⽤:保证数据完整性,机密性和发送⽅⾓⾊的不可抵赖性,加密与签字结合时,两套公私钥是不同的。

2、加密是对信息进⾏编码和解码的技术,编码是把原来可读信息(⼜称明⽂)译成代码形式(⼜称密⽂),其逆过程就是解码(解密),加密技术的要点是加密算法,加密算法可以分为三类: .对称加密 ,⾮对称加密 ,不可逆加密。3、对称加密算法

a、加密过程: 将明⽂分成N个组,然后对各个组进⾏加密,形成各⾃的密⽂,最后把所有的分组密⽂进⾏合并,形成最终的密⽂。b、优点: 算法公开、计算量⼩、加密速度快、加密效率⾼

c、缺点: 交易双⽅都使⽤同样钥匙,安全性得不到保证,密钥管理困难,尤其是在分布式⽹络中d、常⽤算法: DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish4、⾮对称加密算法

a、使⽤过程: ⼄⽅⽣成两把密钥(公钥和私钥),甲⽅获取⼄⽅的公钥,然后⽤它对信息加密。⼄⽅得到加密后的信息,⽤私钥解密,⼄⽅也可⽤私钥加密字符串,甲⽅获取⼄⽅私钥加密数据,⽤公钥解密。

b、优点: 更安全,密钥越长,它就越难破解c、缺点: 加密速度慢

d、常⽤算法: RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

⼆、签名详细

签名⽅法:

public static String sign(String content, String privateKey, String input_charset) {

try {

PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec( Base64.decode(privateKey) ); KeyFactory keyf = KeyFactory.getInstance(\"RSA\"); PrivateKey priKey = keyf.generatePrivate(priPKCS8); java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS);

signature.initSign(priKey);

signature.update( content.getBytes(input_charset) ); byte[] signed = signature.sign();

return Base64.encode(signed); }

catch (Exception e) {

e.printStackTrace(); }

return null; }

验证签名⽅法

public static boolean verify(String content, String sign, String ali_public_key, String input_charset) { try {

KeyFactory keyFactory = KeyFactory.getInstance(\"RSA\"); byte[] encodedKey = Base64.decode(ali_public_key);

PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));

java.security.Signature signature = java.security.Signature .getInstance(SIGN_ALGORITHMS);

signature.initVerify(pubKey);

signature.update( content.getBytes(input_charset) );

boolean bverify = signature.verify( Base64.decode(sign) ); return bverify; }

catch (Exception e) {

e.printStackTrace(); }

return false; }

三、加密详细

公钥加密

public static byte[] encryptByPublicKey(byte[] data, String key) throws Exception {

// 对公钥解密

byte[] keyBytes = decryptBASE64(key); // 取公钥

X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec); // 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); int length = data.length; byte[] enBytes = null;

for (int i = 0; i < length; i += 64) {

byte[] doFinal = cipher.doFinal(ArrayUtils .subarray(data, i, i + 64));

enBytes = ArrayUtils.addAll(enBytes, doFinal); }

return enBytes; }

私钥解密

public static byte[] decryptByPrivateKey(byte[] data, String key) throws Exception {

// 对私钥解密

byte[] keyBytes = decryptBASE64(key);

PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec( keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM); Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); // 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); byte[] deBytes = null; int length = data.length;

for (int i = 0; i < length; i += 128) {

byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + 128));

deBytes = ArrayUtils.addAll(deBytes, doFinal); }

return deBytes; }

运⾏结果图:

项⽬结构图:

其他

如果使⽤了https,是否还需要对接⼝进⾏rsa加密或者签名?

https 防⽌中间⼈攻击, rsa验证⾝份。 缺⼀不可。⽐如⽀付宝的订单接⼝ https,谁都可以调⽤, 但是⽤你的rsa私钥签名是告诉⽀付宝:“这是我调⽤的”,当⽀付宝调⽤你的接⼝,通知你⽀付宝状态的时候, 也会⽤它的私钥签名 告诉你“这的确是来着⽀付宝的请求”,这样才能说明这个订单 是真真实实成功的。JSON 接⼝如何实现 RSA ⾮对称加密与签名

注:本⽂著作权归作者,由demo⼤师代发,拒绝转载,转载需要作者授权

因篇幅问题不能全部显示,请点此查看更多更全内容