炫酷的电商网站设计公司做网站需要好多钱
- 作者: 五速梦信息网
- 时间: 2026年03月21日 07:03
当前位置: 首页 > news >正文
炫酷的电商网站设计,公司做网站需要好多钱,深圳模板,嘉定网站建设网页制作1.前面一篇是AES对称加密写了一个demo,为了后面的两者结合使用,今天去了解学习了下RSA非对称加密. 2.这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥。 (2)非对称加密算法需要两个密钥来进行加密和解密#xff0c;这两个秘钥…1.前面一篇是AES对称加密写了一个demo,为了后面的两者结合使用,今天去了解学习了下RSA非对称加密. 2.这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥。 (2)非对称加密算法需要两个密钥来进行加密和解密这两个秘钥是公开密钥public key简称公钥和私有密钥private key简称私钥。 大致思路: (1)服务端利用RSA创建一对公私钥,服务端存储私钥,将公钥给客户端 (2)每次请求前,将明文数据利用公钥进行加密,然后将密文传递给服务端 (3)服务端拿到密文,利用私钥进行解密,得到明文数据,然后进行业务处理 ps: 如果想做到返回参数也进行加密,那么两个方法, (1)客户端或服务端创建一对公私钥,然后将公私钥传递给服务端或客户端,(这样就可以使用公钥加密,私钥解密了),但是私钥放在客户端就违背了非对称加密(RSA)的原则性了, (2)客户端,创建一对公私钥,服务端在重新创建新的一对公私钥,互相各拿对方的公钥,这样就可以进行传参的加密,解密,和响应数据的加解密!!! 但是为了解决RSA加解密性能问题,请看下篇文章RSAAES(动态获取key)进行混合加密 使用非对称加密(RSA)实践(采用前端加密,后端解密,后端并不返回加密数据): 1.创建spring boot项目,导入相关依赖 2.编写加密工具类 3.编写自定义注解(让加解密细粒度) 4.编写自定义RsaDecodeRequestAdvice 5.创建controller 6.创建jsp或者html,引入js(加密和解密的通用js) ps:因为这里没https证书,所有使用http, 考虑到前后端分离,使用json来传递数据 第一步: 略,不会的请自行百度spring boot项目如何创建! 第二步: import org.apache.commons.codec.binary.Base64; import java.io.ByteArrayOutputStream; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Signature; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; import javax.crypto.Cipher; /** / /** p * RSA公钥/私钥/签名工具包 * /p * p * 罗纳德·李维斯特Ron [R]ivest、阿迪·萨莫尔Adi [S]hamir和伦纳德·阿德曼Leonard [A]dleman * /p * p * 字符串格式的密钥在未在特殊说明情况下都为BASE64编码格式br/ * 由于非对称加密速度极其缓慢一般文件不使用它来加密而是使用对称加密br/ * 非对称加密算法可以用来对对称加密的密钥加密这样保证密钥的安全也就保证了数据的安全 * /p author monkey * date 2018-10-29 */ public class RSAUtils { /** */ /** * 加密算法RSA */ public static final String KEY_ALGORITHM RSA; /** */ /** * 签名算法 */ public static final String SIGNATURE_ALGORITHM MD5withRSA; /** */ /** * 获取公钥的key */ private static final String PUBLIC_KEY RSAPublicKey; /** */ /** * 获取私钥的key */ private static final String PRIVATE_KEY RSAPrivateKey; /** */ /** * RSA最大加密明文大小 */ private static final int MAX_ENCRYPT_BLOCK 117; /** */ /** * RSA最大解密密文大小 */ private static final int MAX_DECRYPT_BLOCK 128; /** */ /** * RSA 位数 如果采用2048 上面最大加密和最大解密则须填写: 245 256 */ private static final int INITIALIZE_LENGTH 1024; /** */ /** * p * 生成密钥对(公钥和私钥) * /p * * return * throws Exception */ public static MapString, Object genKeyPair() throws Exception { KeyPairGenerator keyPairGen KeyPairGenerator.getInstance(KEY_ALGORITHM); keyPairGen.initialize(INITIALIZE_LENGTH); KeyPair keyPair keyPairGen.generateKeyPair(); RSAPublicKey publicKey (RSAPublicKey) keyPair.getPublic(); RSAPrivateKey privateKey (RSAPrivateKey) keyPair.getPrivate(); MapString, Object keyMap new HashMapString, Object(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } /** */ /** * p * 用私钥对信息生成数字签名 * /p * * param data * 已加密数据 * param privateKey * 私钥(BASE64编码) * * return * throws Exception */ public static String sign(byte[] data, String privateKey) throws Exception { byte[] keyBytes Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); PrivateKey privateK keyFactory.generatePrivate(pkcs8KeySpec); Signature signature Signature.getInstance(SIGNATURE_ALGORITHM); signature.initSign(privateK); signature.update(data); return Base64.encodeBase64String(signature.sign()); } /** */ /** * p * 校验数字签名 * /p * * param data * 已加密数据 * param publicKey * 公钥(BASE64编码) * param sign * 数字签名 * * return * throws Exception * */ public static boolean verify(byte[] data, String publicKey, String sign) throws Exception { byte[] keyBytes Base64.decodeBase64(publicKey); X509EncodedKeySpec keySpec new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); PublicKey publicK keyFactory.generatePublic(keySpec); Signature signature Signature.getInstance(SIGNATURE_ALGORITHM); signature.initVerify(publicK); signature.update(data); return signature.verify(Base64.decodeBase64(sign)); } /** */ /** * P * 私钥解密 * /p * * param encryptedData * 已加密数据 * param privateKey * 私钥(BASE64编码) * return * throws Exception */ public static byte[] decryptByPrivateKey(byte[] encryptedData, String privateKey) throws Exception { byte[] keyBytes Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); Key privateK keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateK); int inputLen encryptedData.length; ByteArrayOutputStream out new ByteArrayOutputStream(); int offSet 0; byte[] cache; int i 0; // 对数据分段解密 while (inputLen - offSet 0) { if (inputLen - offSet MAX_DECRYPT_BLOCK) { cache cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i; offSet i * MAX_DECRYPT_BLOCK; } byte[] decryptedData out.toByteArray(); out.close(); return decryptedData; } /** */ /** * p * 公钥解密 * /p * * param encryptedData * 已加密数据 * param publicKey * 公钥(BASE64编码) * return * throws Exception */ public static byte[] decryptByPublicKey(byte[] encryptedData, String publicKey) throws Exception { byte[] keyBytes Base64.decodeBase64(publicKey); X509EncodedKeySpec x509KeySpec new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); Key publicK keyFactory.generatePublic(x509KeySpec); Cipher cipher Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, publicK); int inputLen encryptedData.length; ByteArrayOutputStream out new ByteArrayOutputStream(); int offSet 0; byte[] cache; int i 0; // 对数据分段解密 while (inputLen - offSet 0) { if (inputLen - offSet MAX_DECRYPT_BLOCK) { cache cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); } else { cache cipher.doFinal(encryptedData, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i; offSet i * MAX_DECRYPT_BLOCK; } byte[] decryptedData out.toByteArray(); out.close(); return decryptedData; } /** */ /** * p * 公钥加密 * /p * * param data * 源数据 * param publicKey * 公钥(BASE64编码) * return * throws Exception */ public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception { byte[] keyBytes Base64.decodeBase64(publicKey); X509EncodedKeySpec x509KeySpec new X509EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); Key publicK keyFactory.generatePublic(x509KeySpec); // 对数据加密 Cipher cipher Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicK); int inputLen data.length; ByteArrayOutputStream out new ByteArrayOutputStream(); int offSet 0; byte[] cache; int i 0; // 对数据分段加密 while (inputLen - offSet 0) { if (inputLen - offSet MAX_ENCRYPT_BLOCK) { cache cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i; offSet i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData out.toByteArray(); out.close(); return encryptedData; } /** */ /** * p * 私钥加密 * /p * * param data * 源数据 * param privateKey * 私钥(BASE64编码) * return * throws Exception */ public static byte[] encryptByPrivateKey(byte[] data, String privateKey) throws Exception { byte[] keyBytes Base64.decodeBase64(privateKey); PKCS8EncodedKeySpec pkcs8KeySpec new PKCS8EncodedKeySpec(keyBytes); KeyFactory keyFactory KeyFactory.getInstance(KEY_ALGORITHM); Key privateK keyFactory.generatePrivate(pkcs8KeySpec); Cipher cipher Cipher.getInstance(keyFactory.getAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateK); int inputLen data.length; ByteArrayOutputStream out new ByteArrayOutputStream(); int offSet 0; byte[] cache; int i 0; // 对数据分段加密 while (inputLen - offSet 0) { if (inputLen - offSet MAX_ENCRYPT_BLOCK) { cache cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); } else { cache cipher.doFinal(data, offSet, inputLen - offSet); } out.write(cache, 0, cache.length); i; offSet i * MAX_ENCRYPT_BLOCK; } byte[] encryptedData out.toByteArray(); out.close(); return encryptedData; } /** */ /** * p * 获取私钥 * /p * * param keyMap * 密钥对 * return * throws Exception */ public static String getPrivateKey(MapString, Object keyMap) throws Exception { Key key (Key) keyMap.get(PRIVATE_KEY); return Base64.encodeBase64String(key.getEncoded()); } /** */ /** * p * 获取公钥 * /p * * param keyMap * 密钥对 * return * throws Exception */ public static String getPublicKey(MapString, Object keyMap) throws Exception { Key key (Key) keyMap.get(PUBLIC_KEY); return Base64.encodeBase64String(key.getEncoded()); } /** * java端公钥加密 */ public static String encryptedDataOnJava(String data, String PUBLICKEY) { try { data Base64.encodeBase64String(encryptByPublicKey(data.getBytes(), PUBLICKEY)); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } return data; } /** * java端私钥解密 / public static String decryptDataOnJava(String data, String PRIVATEKEY) { String temp ; try { byte[] rs Base64.decodeBase64(data); temp new String(RSAUtils.decryptByPrivateKey(rs, PRIVATEKEY),UTF-8); } catch (Exception e) { e.printStackTrace(); } return temp; } public static void main(String[] args) throws Exception{ } } 第三步: import org.springframework.web.bind.annotation.Mapping; import java.lang.annotation.; /** * author monkey * desc 请求数据解密 * date 2018/10/29 20:17 / Target({ElementType.METHOD,ElementType.TYPE}) Retention(RetentionPolicy.RUNTIME) Mapping Documented public interface RsaSecurityParameter { /** 入参是否解密默认解密 / boolean inDecode() default true; /** 出参是否加密默认加密 / boolean outEncode() default true; } 第四步: import com.monkey.springboot.demo.annotation.RsaSecurityParameter; import com.monkey.springboot.demo.utils.RSAUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.MethodParameter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; /** author monkey * desc 请求数据解密 * date 2018/10/29 20:17 / ControllerAdvice(basePackages com.monkey.springboot.demo.controller) public class RsaDecodeRequestBodyAdvice implements RequestBodyAdvice { private static final Logger logger LoggerFactory.getLogger(RsaDecodeRequestBodyAdvice.class); private static final String PRIVATE_KEYMIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAIn2zWqU7K/2qm5pOpq5bp9R3MTnStWTfJU9nC/Vo7UKH9dITPvrELCTKqlqpx5Fesl0GY7n6u4n4jyiw4ejsvkZYQ5ww477yLOn2FcoEGuZEwPgSCmfTST0OFUgQqn/J11k9L92jEHyieE3qmhMkMt0UsVUSJwx/nZxo30ZAgMBAAECgYBD3YHigeuEC4R14iaf8jo2j0kuGtB3Cxvnlez0otTqw1YyYkBsU49cLKkXvfKVEgM0Ow/QltgKvSBxCE31PrrDka5TygVMqqA/IM7NrDvjUcGLjyoeNmLA8660fWcDxUTlAGN5kxIvUATayVwKVflpWPWu0FPKsWrZustnEo4QJBAMCmYsWqAKWYMVRXFP3/XGRfio8DV793TOckyBSN9eh8UhgoZyT3u7oeHmDJEwm4aNMHlg1Pcdc6tNsvi1FRCiUCQQC3VNzfF4xOtUgX7vWPL8YVljLuXmy12iVYmg6ofu9l31nwM9FLQ1TRFglvF5LWrIXTQb07PgGd5DJMAQWGsqLlAkAPE7Z9M73TNL8b8hDzJ1leZi1cpSGdoa9PEKwYR/SrxAZtefEmLEQSEtf8OfrEtetWCeyo0pvKKiOEFXytFAkEAgynL/DC0yXsZYUYtmYvshHU5ayFTVagFICbYZeSrEoBoUDxdI9vl0fU6A5NmBlGhaZ65GwaG5jLc1tTrlvoQJAXBEoPcBNAosiZHQfYBwHqU6mJ9/ZacJh3MtJzGGebfEwJgtln5b154iANqNWXpySBLvkKBoq7FYRiD83pqmUg; Override public boolean supports(MethodParameter methodParameter, Type type, Class? extends HttpMessageConverter? aClass) { return true; } Override public Object handleEmptyBody(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class? extends HttpMessageConverter? aClass) { return body; } Override public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter methodParameter, Type type, Class? extends HttpMessageConverter? aClass) throws IOException { try { boolean encode false; if (methodParameter.getMethod().isAnnotationPresent(RsaSecurityParameter.class)) { //获取注解配置的包含和去除字段 RsaSecurityParameter serializedField methodParameter.getMethodAnnotation(RsaSecurityParameter.class); //入参是否需要解密 encode serializedField.inDecode(); } if (encode) { logger.info(对方法method :【 methodParameter.getMethod().getName() 】返回数据进行解密); return new MyHttpInputMessage(inputMessage); }else{ return inputMessage; } } catch (Exception e) { e.printStackTrace(); logger.error(对方法method :【 methodParameter.getMethod().getName() 】返回数据进行解密出现异常e.getMessage()); return inputMessage; } } Override public Object afterBodyRead(Object body, HttpInputMessage httpInputMessage, MethodParameter methodParameter, Type type, Class? extends HttpMessageConverter? aClass) { return body; } class MyHttpInputMessage implements HttpInputMessage { private HttpHeaders headers; private InputStream body; public MyHttpInputMessage(HttpInputMessage inputMessage) throws Exception { this.headers inputMessage.getHeaders(); String content easpString(IOUtils.toString(inputMessage.getBody(),utf-8)); this.body IOUtils.toInputStream(RSAUtils.decryptDataOnJava(content,PRIVATE_KEY)); } Override public InputStream getBody() throws IOException { return body; } Override public HttpHeaders getHeaders() { return headers; } /** * param requestData * return / public String easpString(String requestData){ if(requestData ! null !requestData.equals()){ String s {\requestData:; if(!requestData.startsWith(s)){ throw new RuntimeException(参数【requestData】缺失异常); }else{ int closeLen requestData.length()-1; int openLen {\requestData:.length(); String substring StringUtils.substring(requestData, openLen, closeLen); return substring; } } return ; } } } 第五步: /** 跳转rsa页面 * * return / RequestMapping(/rsa) public String goRsa() { return rsa; } /** RSA测试 * * return object */ RequestMapping(/rsaTest) ResponseBody RsaSecurityParameter public Persion rsaTest(RequestBody Persion info) { System.out.println(info.getName()); String content 内容; info.setName(content); return info; } 第六步: 只需要引入这两个js文件,然后自定义一个html,这里采用了thymeleaf模板引擎.具体语法自行百度,很简单! !DOCTYPE html html langen xmlns:thhttp://www.thymeleaf.org head meta charsetUTF-8 titleRSA 加解密/title script typetext/javascript th:src{/js/jquery-2.2.3.min.js}/script script typetext/javascript th:src{/js/jsencrypt.min.js}/script /head body script typetext/javascript \((function() { \)(#bt).click( function() { var encrypt new JSEncrypt(); encrypt.setPublicKey(\((#publickey).val()); \).ajax({ type: POST, url:/rsaTest, data:{\requestData:encrypt.encrypt(JSON.stringify({name:好看}))}, dataType:json, contentType: application/json, success: function(result) { alert(解密的名称 uncrypted); } }); }); }); /script h2公钥/h2 textarea idpublickey rows5 cols45MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCJ9s1qlOyv9qpuaTqauW6fUftzE50rVk3yVPZwv1aO1Ch/XSEz76xCwkyvqpaqceRXrPpdBmO5ruJI8osOHo7L5GWEOcMOO8izp9hXKBBrmRMD4Egpn00k9DhVIEKp/vyddZPS/doxB8onhN6poTJDLdFLFVEicMf52caN9GQIDAQAB /textarea input typebutton idbt value提交 / /body /html GitHub - kaifengxu/demo: AESRSArecaptcha综合demo 学习加密(四)spring boot 使用RSAAES混合加密,前后端传递参数加解密(方式一)_spring boot rsa rsa最大加密明文大小-CSDN博客
- 上一篇: 炫酷的电商网站设计分类目录不要前缀wordpress
- 下一篇: 炫酷的网站免费windows云电脑
相关文章
-
炫酷的电商网站设计分类目录不要前缀wordpress
炫酷的电商网站设计分类目录不要前缀wordpress
- 技术栈
- 2026年03月21日
-
选择响应式网站兰州发布紧急通知
选择响应式网站兰州发布紧急通知
- 技术栈
- 2026年03月21日
-
选择网站建设系统全网模板建站系统
选择网站建设系统全网模板建站系统
- 技术栈
- 2026年03月21日
-
炫酷的网站免费windows云电脑
炫酷的网站免费windows云电脑
- 技术栈
- 2026年03月21日
-
薛华成 旅游网站建设长治网站制作
薛华成 旅游网站建设长治网站制作
- 技术栈
- 2026年03月21日
-
学app软件开发多少钱网站建设一条龙全包seo
学app软件开发多少钱网站建设一条龙全包seo
- 技术栈
- 2026年03月21日
