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


    代码地址如下:
    http://www.demodashi.com/demo/14000.html

    一、概述

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

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

    3、对称加密算法

    a、加密过程: 将明文分成N个组,然后对各个组进行加密,形成各自的密文,最后把所有的分组密文进行合并,形成最终的密文。

    b、优点: 算法公开、计算量小、加密速度快、加密效率高

    c、缺点: 交易双方都使用同样钥匙,安全性得不到保证,密钥管理困难,尤其是在分布式网络中

    d、常用算法: DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish

    4、非对称加密算法

    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 非对称加密与签名

    代码地址如下:
    http://www.demodashi.com/demo/14000.html

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

  • 相关阅读:
    python虚拟环境--virtualenv
    求导法则和高阶导数
    restful规范
    python协程--yield和yield from
    打印质数
    更改docker的存储位置
    同台ECS安装多个mysql
    jenkins + gitlab + harbor + k8s 部署项目
    jenkins 配置maven
    gitlab + jenkins 持续集成
  • 原文地址:https://www.cnblogs.com/demodashi/p/9711827.html
Copyright © 2020-2023  润新知