微服务架构 | 数据加密有哪些常用的加密方式?

admin 2025-05-17 15人围观 ,发现268个评论

导读:之前文章中有提到对称加密之DES加密与解密以及非对称加密之RSA加密与解密。本篇继续接着之前的话题聊聊微服务的加密方式

一、背景

之前文章中有两处错误简单做了调整,还有一点就是代码上的调整未做更新非对称加密之AES加密与解密。写错应该是RSA。

▐非对称加密之AES加密与解密


加密过程是通过Encoding指定不同的代码页,把字符转成不同代码页对应的编码,表现为byte[]

解密过程是加密时Encoding使用的代码页,把byte[]形式的明文转为适当的字符串明文

/**RSA加解密处理组件*/publicclassRsaEncryptProvider{publicstaticfinalStringRSA="RSA";publicstaticfinalStringCHARSET_NAME="UTF-8";/***RSA私钥*/privatebyte[]privateCodeByte;/***RSA公钥*/privatebyte[]publicCodeByte;}
RSA公钥加密
publicStringencrypt(StringencryptStr){StringoutStr=null;try{RSAPublicKeypubKey=(RSAPublicKey)(RSA).generatePublic(newX509EncodedKeySpec(publicCodeByte));//RSA加密Ciphercipher=(RSA);(_MODE,pubKey);outStr=().encodeToString(((CHARSET_NAME)));}catch(InvalidKeySpecExceptione){("无效的密钥规范",e);}catch(NoSuchAlgorithmExceptione){("无效的算法",e);}catch(NoSuchPaddingExceptione){("无效的算法",e);}catch(InvalidKeyExceptione){("无效的密钥",e);}catch(IllegalBlockSizeExceptione){("非法块大小",e);}catch(BadPaddingExceptione){("错误填充异常",e);}catch(UnsupportedEncodingExceptione){("不支持的编码异常",e);}returnoutStr;}
RSA私钥解密
publicStringdecrypt(StringdecryptStr){StringoutStr=null;try{//64位解码加密后的字符串byte[]inputByte=().decode((CHARSET_NAME));//私钥RSAPrivateKeypriKey=(RSAPrivateKey)(RSA).generatePrivate(newPKCS8EncodedKeySpec(privateCodeByte));//RSA解密Ciphercipher=(RSA);(_MODE,priKey);outStr=newString((inputByte));}catch(Exceptione){("RSA解密失败",e);}returnoutStr;}

二、非对称加密之RSA加密与解密

▐随机生成密钥对

基于RSA算法生成对象返回一个KeyPairGenerator对象,它为指定的算法生成公钥/私钥对。此方法遍历已注册安全提供程序的列表,从最喜欢的提供程序开始。返回一个新的KeyPairGenerator对象,该对象封装了来自支持指定算法的第一个Provider的KeyPairGeneratorSpi实现。

请注意,可以通过()方法检索已注册提供程序的列表

publicstaticvoidgenKeyPair()throwsNoSuchAlgorithmException{//KeyPairGenerator类用于生成公钥和私钥对,基于RSA算法生成对象KeyPairGeneratorkeyPairGen=("RSA");//初始化密钥对生成器,密钥大小为96-1024位(1024,newSecureRandom());//生成一个密钥对,保存在keyPair中KeyPairkeyPair=();//得到私钥RSAPrivateKeyprivateKey=(RSAPrivateKey)();//得到公钥RSAPublicKeypublicKey=(RSAPublicKey)();StringpublicKeyString=newString((()));//得到私钥字符串StringprivateKeyString=newString(((())));//将公钥和私钥保存到Map//0表示公钥("公钥16进制:"+publicKeyString);//1表示私钥("私钥16进制:"+privateKeyString);}

生成结果

公钥16进制:30819f300d06092a864886f70d010101050003818d00308ac8192db5b48d3037ea88fc419f17b9a1cabea6ff18707f9bdc52f67a87b1246b3ff04bb0e96b795f9d58cd5c83b6f6938fe7d9b74b07f7b54d3fc8784783fd9b026b1ec59565429521bbbfa3b45780e3367061ddb20a4b302393aabc22ea6fb6302ad4f4e4ff86a9592decc61ca6888b2b429d2541b354920271b78ef094e6b0203010001私钥16进制:30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100ac8192db5b48d3037ea88fc419f17b9a1cabea6ff18707f9bdc52f67a87b1246b3ff04bb0e96b795f9d58cd5c83b6f6938fe7d9b74b07f7b54d3fc8784783fd9b026b1ec59565429521bbbfa3b45780e3367061ddb20a4b302393aabc22ea6fb6302ad4f4e4ff86a9592decc61ca6888b2b429d2541b354920271b78ef094e6b020301000102818005383a7856afc26ac5a7560a49faab91c332547aa4a5405187337336c0bb509741150350a1a55fd2b2e78a4661b3a2b05d601deed93e09ed7268a3a87a12a563e517cb7aca04e9f53b4b1180dce3b40e9d2acc930f603d000c53d14be31533b8e28d34ed8506e012ad01c9f0c8db77509157ae4041831032dfe42a796bb0eb99024100e190a43b11431830f6542dd64d7c773c3b1004835d6ffd1bc74446d28eaaab81e8b34b14cae756765ef695cc3a27cd08916d299ad9b41ba1908006759b9c9c3d024100c3c832cc11c3747ef97f6a84b37d3adf7f106c62992636b902f229342a779d38e4cdb5460242aa462e07b36e8f238daec743b26113fcc2e8be617390cb91f7c70240666d88264a706d4bce8feb40a56f1fb5fa1c0bf09b3d7f725dca635eb9ea46777773f3643dbf4f43f15b882a753e1d9d066ccbb7c5a443e7d9f648f89ef13f0102403d0b24db800663425be4a07fb3bf2e26156637851e9f4d9cae10774c6e99510a363cf57258ae148d4138e1776d65f67d32602734219943e471c7ccd2aec65a6d02410092289958fb783b3868d5c7b72d61a56a2ff1253b293d55203a6df26cb3e9ddb617eb1c2cab9d37b889660d3ee0f234e16da863b5269af74bbb9bf
▐加密和解密
publicstaticvoidencryptAndDecrypt(){//生成公钥和私钥Stringp="30819f300d06092a864886f70d010101050003818d00308ac8192db5b48d3037ea88fc419f17b9a1cabea6ff18707f9bdc52f67a87b1246b3ff04bb0e96b795f9d58cd5c83b6f6938fe7d9b74b07f7b54d3fc8784783fd9b026b1ec59565429521bbbfa3b45780e3367061ddb20a4b302393aabc22ea6fb6302ad4f4e4ff86a9592decc61ca6888b2b429d2541b354920271b78ef094e6b0203010001";Stringpr="30820276020100300d06092a864886f70d0101010500048202603082025c02010002818100ac8192db5b48d3037ea88fc419f17b9a1cabea6ff18707f9bdc52f67a87b1246b3ff04bb0e96b795f9d58cd5c83b6f6938fe7d9b74b07f7b54d3fc8784783fd9b026b1ec59565429521bbbfa3b45780e3367061ddb20a4b302393aabc22ea6fb6302ad4f4e4ff86a9592decc61ca6888b2b429d2541b354920271b78ef094e6b020301000102818005383a7856afc26ac5a7560a49faab91c332547aa4a5405187337336c0bb509741150350a1a55fd2b2e78a4661b3a2b05d601deed93e09ed7268a3a87a12a563e517cb7aca04e9f53b4b1180dce3b40e9d2acc930f603d000c53d14be31533b8e28d34ed8506e012ad01c9f0c8db77509157ae4041831032dfe42a796bb0eb99024100e190a43b11431830f6542dd64d7c773c3b1004835d6ffd1bc74446d28eaaab81e8b34b14cae756765ef695cc3a27cd08916d299ad9b41ba1908006759b9c9c3d024100c3c832cc11c3747ef97f6a84b37d3adf7f106c62992636b902f229342a779d38e4cdb5460242aa462e07b36e8f238daec743b26113fcc2e8be617390cb91f7c70240666d88264a706d4bce8feb40a56f1fb5fa1c0bf09b3d7f725dca635eb9ea46777773f3643dbf4f43f15b882a753e1d9d066ccbb7c5a443e7d9f648f89ef13f0102403d0b24db800663425be4a07fb3bf2e26156637851e9f4d9cae10774c6e99510a363cf57258ae148d4138e1776d65f67d32602734219943e471c7ccd2aec65a6d02410092289958fb783b3868d5c7b72d61a56a2ff1253b293d55203a6df26cb3e9ddb617eb1c2cab9d37b889660d3ee0f234e16da863b5269af74bbb9bf";RsaEncryptProviderrsaEncryptProvider=newRsaEncryptProvider((pr),(p));//加密字符串Stringmessage="1";("原密码:"+message);StringrsaEn=(message);("RSA加密:"+rsaEn);StringurlEn=(rsaEn,"utf-8");("url编码:"+urlEn);//解码rsaEn=(urlEn,"utf-8");message=(rsaEn);("还原后的字符串为:"+message);Md5EncryptProvidermd5EncryptProvider=newMd5EncryptProvider(null);("MD5:"+(message));}

三、AES加密与解密

高级加密标准(AES,AdvancedEncryptionStandard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:

明文P:没有经过加密的数据。

密钥K:用来加密明文的密码,在对称加密算法中,加密与解密的密钥是相同的。密钥为接收方与发送方协商产生,但不可以直接在网络上传输,否则会导致密钥泄漏,通常是通过非对称加密算法加密密钥,然后再通过网络传输给对方,或者直接面对面商量密钥。密钥是绝对不可以泄漏的,否则会被攻击者还原密文,窃取机密数据。

AES加密函数:设AES加密函数为E,则C=E(K,P),其中P为明文,K为密钥,C为密文。也就是说,把明文P和密钥K作为加密函数的参数输入,则加密函数E会输出密文C。

密文C:经加密函数处理后的数据

AES解密函数:设AES解密函数为D,则P=D(K,C),其中C为密文,K为密钥,P为明文。也就是说,把密文C和密钥K作为解密函数的参数输入,则解密函数会输出明文P。

实际中,一般是通过RSA加密AES的密钥,传输到接收方,接收方解密得到AES密钥,然后发送方和接收方用AES密钥来通信。先前有一篇文章中提到服务之间的安全问题

SpringCloud中如何保证各个微服务之间调用的安全性?

服务之间的应用名通过AES加密,被调用放通过密钥对X-SERVICE-NAME进行解密,来确定服务是否允许被集成调用。感兴趣的可以查阅了解

▐加密
/**加密*/publicStringencrypt(StringencryptStr){synchronized(){try{(_MODE,secretKey,ivParam);byte[]encodes=().encode(((CHARSET_DEFAULT)));(encodes);}catch(Exceptione){(ENCRYPT_AES+"加密出错",e);}}returnnull;}
▐解密
/**解密*/publicStringdecrypt(StringdecryptStr){synchronized(){try{(_MODE,secretKey,ivParam);returnnewString((().decode((decryptStr))),CHARSET_DEFAULT);}catch(Exceptione){(ENCRYPT_AES+"解密出错",e);}}returnnull;}

猜你喜欢
    不容错过