怎么做免费网站被收录,一个网站的制作步骤,万网备案网站名称,南京网站设计我选柚米科技页面输入用户名密码登录过程中#xff0c;如果没有对用户名密码进行加密处理#xff0c;可能会导致传输过程中数据被窃取#xff0c;就算使用https协议#xff0c;在浏览器控制台的Request Payload中也是能直接看到传输的明文#xff0c;安全感是否还是不足。
大致流程如果没有对用户名密码进行加密处理可能会导致传输过程中数据被窃取就算使用https协议在浏览器控制台的Request Payload中也是能直接看到传输的明文安全感是否还是不足。
大致流程前端在请求登录接口之前对用户名密码进行加密服务端收到请求后解密得到明文的用户名密码。
这里使用RSA非对称加密前端使用公钥加密后端使用私钥解密这样就不会暴露私钥。
一、后端 1、pom文件添加依赖 dependencygroupIdcn.hutool/groupIdartifactIdhutool-core/artifactIdversion5.8.22/version/dependencydependencygroupIdcn.hutool/groupIdartifactIdhutool-crypto/artifactIdversion5.8.22/version/dependency
2、加密解密工具类
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.RSA;public class SecretConstant {/*** 登陆相关*/public class LoginSecret{/*** 非对称加密 私钥 公钥私钥可以自己用代码生成也可以在线生成例如https://tool.ip138.com/rsa/*/public static final String PRIVATE_KEY MIIBOAIBAAJAflJQPKoKO9gz9Op2XINkHXVIyonzt/HClZRVf2MyF4OLGckiBLM\n rLq6jN/U4JlgIxCIni3zOsJdhIIF1D6fQwIDAQABAkAsKpeHPmSpmQo6OSoRXl\n /tXeivE9xTelmOF0AxiQDWRu1XWKAmjR2kKBgN/B9NlhBjW5p4PW30UI7uCyKUR\n AiEAw8ba06ZG7CZyXZVD8MhFx0ztg0kIEZLOqGpjSpKC70CIQClLfTWxpTbF4gb\n lxDOJL5G1XiXcM516MUz6q3udTiG/wIgZ0v929yI4ULr5urB/UJZsj1LOcUxwMk\n wFvaDSy6AvUCIAehu/JAcpg82hkMPcaIhBIZwtycZa2k95eSfD7MQ7RZAiAY8yI\n MkG4asXqoh2jryn40ih2q/GnXoCwdPXUa9E4MA;/*** 非对称加密 公钥*/public static final String PUBLIC_KEY MFswDQYJKoZIhvcNAQEBBQADSgAwRwJAflJQPKoKO9gz9Op2XINkHXVIyonzt/HClZRVf2MyF4OLGckiBLMrLq6jN/U4JlgIxCIni3zOsJdhIIF1D6fQwIDAQAB;}/*** 测试一下* param args*/public static void main(String[] args) {String un admin;String pw admin123456;// 用户名密码解密RSA rsa new RSA(SecretConstant.LoginSecret.PRIVATE_KEY, SecretConstant.LoginSecret.PUBLIC_KEY);String un_jm rsa.encryptBase64(un,KeyType.PublicKey);System.out.println(公钥加密后un_jm);// 前端传过来的用户名密码是通过公钥加密的String userName_plaintext rsa.decryptStr(un_jm, KeyType.PrivateKey);System.out.println(私钥解密后userName_plaintext);// 加密后的密文String temp djCaCjhwVRc29vNHEIUqoGkn0azDjGdjHHVzetw8GcKmJ8u2/VgAX54G/zzpcrBrpkRSmS7QPkpSz5s05OLA;System.out.println(私钥解密后rsa.decryptStr(temp, KeyType.PrivateKey));}
}
3、使用示例 public BaseResult login(String userNameCipher, String passwordCipher) {// 用户名密码解密RSA rsa new RSA(SecretConstant.LoginSecret.PRIVATE_KEY, SecretConstant.LoginSecret.PUBLIC_KEY);String userName rsa.decryptStr(userNameCipher, KeyType.PrivateKey);String password rsa.decryptStr(passwordCipher, KeyType.PrivateKey);// 登录逻辑...} 二、前端 前端使用公钥加密秘钥可以直接写在js文件中因为用的是公钥所以不怕泄漏当然了如果想灵活一点可以把公钥放在后端前端通过接口查询得到公钥。
1、加密工具类
文件名称encryptUtils.js内容如下其他地方调用即可。 import JSEncrypt from jsencrypt;// 可能需要需要先安装jsencrypt库执行npm install jsencrypt /*** 登录使用的公钥* 如果想灵活一点可以把公钥放在后端前端通过接口查询得到公钥。* type {string}*/
const LOGIN_PUBLIC_KEY MFswDQYJKoZIhvcNAQEBBQADSgAwRwJAflJQPKoKO9gz9Op2XINkHXVIyonzt/HClZRVf2MyF4OLGckiBLMrLq6jN/U4JlgIxCIni3zOsJdhIIF1D6fQwIDAQAB;/*** 获取登录使用的公钥* returns {string}*/
export const getLoginPublicKey () {return LOGIN_PUBLIC_KEY;
}/*** 加密* param text 需要加密的文本* param publicKey 公钥* returns {string | false}*/
export const encodeStr (text, publicKey) {// RSA非对称加密const JSE new JSEncrypt();// 设置公钥JSE.setPublicKey(publicKey);return JSE.encrypt(text);
}
2、使用示例
在需要加密的地方调用上面的方法
import request from /utils/request;
import { getLoginPublicKey, encodeStr } from /utils/encryptUtils;/*** 请求后端登录的方法*/
export async function login(params) {// 公钥加密params.userName encodeStr(params.userName, getLoginPublicKey());params.password encodeStr(params.password, getLoginPublicKey());const result await request(/api/v1/user/login, {method: POST,type: JSON,body: params});return result;
}
前端加密后请求后端解密得到明文。