网站密码明文传输解决方案js+java

2023-10-27

解决密码明文传输的方案,基本有两种解决方案

1,将项目网站全站升级为https协议(如果要更谨慎,还需要加密)。

2,将密码进行加密后,在后台解密。

因项目升级https时间周期太长。将暂时替代方案改为RSA加密解密方式:

最简单的方案,前端加密,后端解密。未涉及到私钥签名等验证。但工具类内提供方法,相信各位一看即懂。

1,前端js引入jsencrypt.js(官网有下载资源。可免费下载(但不兼容ie浏览器,在ie9以下使用会导致js报错SCRIPT1010,具体原因可自行google或百度)。本博客下载资源内有兼容IE的版本,有需要的小伙伴可以下载)。

2,在前端js中使用方法:

    var passWord = document.getElementById("j_password");
    //密码RSA加密
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey("MIGfMA0GC4351345135134534");//此处为RSA公钥
    var passwordRSA = encrypt.encrypt(passWord.value);

3,将密码密文传输后台

4,后台java的工具类

注:公钥私钥可以根据本工具类的initkey()方法生成。生成后将公钥私钥存储,具体存储看各位自己需求

/**
 * @Auther: pluto
 * @Date: 2019/2/27 10:09
 * @Description: RSAutil
 */
public class RSAUtils {
    private static Log log = LogFactory.getLog(RSAUtils.class);
    private static final String KEYALGORITHM = "RSA";
    private static final String SIGNATUREALGORITHM = "MD5withRSA";

    private static final String PUBLICKEY = "RSAPublicKey";
    private static final String PRIVATEKEY = "RSAPrivateKey";

    //rsa私钥  或者可从配置文件读取。
    public static final String DECRYPTPRIVATEKEY = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAIMzJa4oZpQcPhRDTIaWnF4olSaeGt5oV0XFwoeeSK+FZ3lc4N34523tdfasgba";

    private RSAUtils(){super();}

    public static byte[] decryptBASE64(String key) {
        Base64 base64 = new Base64();
        return base64.decode(key);
    }

    public static String encryptBASE64(byte[] bytes) {
        Base64 base64 = new Base64();
        return base64.encodeToString(bytes);
    }

    /**
     *
     *
     * @param data
     *
     * @param privateKey
     *
     * @return
     * @throws Exception
     */
    public static String sign(byte[] data, String privateKey){
        try {

            byte[] keyBytes = decryptBASE64(privateKey);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);

            PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec);

            Signature signature = Signature.getInstance(SIGNATUREALGORITHM);
            signature.initSign(priKey);
            signature.update(data);
            return encryptBASE64(signature.sign());
        }catch (Exception e){
            log.error("RSAUtilsSignError");
            return "";
        }
    }

    /**
     *
     *
     * @param data
     *
     * @param publicKey
     *
     * @param sign
     *
     * @return
     * @throws Exception
     */
    public static boolean verify(byte[] data, String publicKey, String sign){
        try {

            byte[] keyBytes = decryptBASE64(publicKey);

            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);

            PublicKey pubKey = keyFactory.generatePublic(keySpec);
            Signature signature = Signature.getInstance(SIGNATUREALGORITHM);
            signature.initVerify(pubKey);
            signature.update(data);

            return signature.verify(decryptBASE64(sign));
        }catch (Exception e){
            log.error("RSAUtilsVerifySignError");
            return false;
        }
    }

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

            byte[] keyBytes = decryptBASE64(key);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return cipher.doFinal(data);
        }catch (Exception e){
            log.error("RSAUtilsPrivateKeyDecryptError");
            return new byte[0];
        }
    }

    /**
     *
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptByPrivateKey(String data, String key){
        return decryptByPrivateKey(decryptBASE64(data), key);
    }

    /**
     *
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] decryptByPublicKey(byte[] data, String key){
        try {

            byte[] keyBytes = decryptBASE64(key);

            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);
            Key publicKey = keyFactory.generatePublic(x509KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.DECRYPT_MODE, publicKey);
            return cipher.doFinal(data);
        }catch (Exception e){
            log.error("RSAUtilsPublicKeyDecryptError");
            return new byte[0];
        }

    }

    /**
     *
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encryptByPublicKey(String data, String key) {
        try {

            byte[] keyBytes = decryptBASE64(key);

            X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);
            Key publicKey = keyFactory.generatePublic(x509KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return cipher.doFinal(data.getBytes());
        }catch (Exception e){
            log.error("RSAUtilsPublicKeyEncryptError");
            return new byte[0];
        }
    }

    /**
     *
     * @param data
     * @param key
     * @return
     * @throws Exception
     */
    public static byte[] encryptByPrivateKey(byte[] data, String key){
        try {

            byte[] keyBytes = decryptBASE64(key);

            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
            KeyFactory keyFactory = KeyFactory.getInstance(KEYALGORITHM);
            Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec);

            Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
            cipher.init(Cipher.ENCRYPT_MODE, privateKey);
            return cipher.doFinal(data);
        }catch (Exception e){
            log.error("RSAUtilsPrivateKeyEncryptError");
            return new byte[0];
        }
    }

    /**
     *
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPrivateKey(Map<String, Key> keyMap){
        if(keyMap != null){
            Key key = keyMap.get(PRIVATEKEY);
            return encryptBASE64(key.getEncoded());
        }else{
            return "";
        }
    }

    /**
     *
     * @param keyMap
     * @return
     * @throws Exception
     */
    public static String getPublicKey(Map<String, Key> keyMap){
        if(keyMap != null){
            Key key = keyMap.get(PUBLICKEY);
            return encryptBASE64(key.getEncoded());
        }else {
            return "";
        }
    }

    /**
     *
     * @return
     * @throws Exception
     */
    public static Map<String, Key> initKey(){
        try {
            KeyPairGenerator keyPairGen = KeyPairGenerator
                    .getInstance(KEYALGORITHM);
            keyPairGen.initialize(2048);
            KeyPair keyPair = keyPairGen.generateKeyPair();
            Map<String, Key> keyMap = new HashMap(2);
            keyMap.put(PUBLICKEY, keyPair.getPublic());
            keyMap.put(PRIVATEKEY, keyPair.getPrivate());
            return keyMap;
        } catch (NoSuchAlgorithmException e) {
            log.error("RSAUtilsInitKeyError");
            return null;
        }
    }
}

5,接取并解密

注:若为ajax传输,可不必转码,若form表单形式提交,js会自动转码,后台需要解码。(也可统一解码,毕竟没什么影响)

代码如下:

		String pass=request.getParameter("pass");
		//此处进行密码的解密 begin
		try {
			pass = URLDecoder.decode(pass,"UTF-8").replace(' ', '+');
		} catch (UnsupportedEncodingException e1) {
			return new ModelAndView(this.getErrorView());
		}
		byte[] decryptData = RSAUtils.decryptByPrivateKey(pass,RSAUtils.DECRYPTPRIVATEKEY);
		String decryptPas = "";
		if(decryptData.length == 0){
			return new ModelAndView(this.getErrorView());
		}else{
			decryptPas = new String(decryptData);
		}
		//此处进行密码的解密 end

获取到解密后的密码走正常的业务流程即可!

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网站密码明文传输解决方案js+java 的相关文章

  • 使用c实现rsa加密解密

    我正在尝试使用 Open SSL 编写 RSA 加密和解密的 C 代码 但我不能这样做 我用谷歌搜索了它 但无论我从互联网上得到什么代码 它都超出了我的想象 main函数在这里 这是我从堆栈溢出中得到的 我尝试使用它 但它不起作用 可能是我
  • 如何在 iPhone/Objective C 上找出 RSA 公钥的模数和指数

    有没有可能的方法来找出使用 SecKeyGeneratePair 一般的安全框架 创建的公钥的模数和指数 我对此很困惑 但这是我找到的解决方案 不使用任何外部包 首先 转到 Apple 的 CryptoExercise 示例 从那里下载 S
  • 从公钥+私钥创建 RSAParamaters 对象

    我需要使用私钥和公钥 key 和 cer 文件 在 Net 中创建 RSAParameters 对象 是否可以在 Net 中做到这一点而不使用第三方软件 如果是这样 我应该去哪里寻找 我最终需要从该对象中提取指数 模数 D P Q DP D
  • Android RSA 加密与 OAEP 使用 SHA-256 进行主摘要和 MGF1 摘要

    根据规范 我需要对两个摘要 主摘要和 MGF1 摘要 使用带有 SHA 256 的 RSA ECB OAEPPadding 密码 安卓密码学 https developer android com guide topics security
  • 如何在 RSAParameters 上设置用于 RSACryptoServiceProvider 的公钥和私钥?

    我在网上阅读了一些教程 并生成了公钥和私钥 但是如何将它们设置为在 C 中使用 这是我所拥有的 string publicKey string privateKey UnicodeEncoding ByteConverter new Uni
  • Android KeyStore私有指数无法提取

    我想在 Android 密钥库中生成 RSA 密钥对 从 Android 4 3 开始 应该可以在 Android 系统密钥库中生成 RSA 密钥 我通过 工作正常 生成我的 RSA 密钥 Calendar notBefore Calend
  • 为什么 KeyPairGenerator.genKeyPair() 这么慢

    我有一些 Java 代码 当我运行函数时KeyPairGenerator genKayPair 工作时间为 40 秒或更长时间 如何改变这种现状呢 如果我跑 openssl req x509 nodes days 365 newkey rs
  • Android 中的 PEM 到 PublicKey

    我见过很多类似的问题 但没有一个对我有用 我只是想将从服务器检索到的 PEM 格式的 RSA 公钥转换为PublicKey在安卓中 有人能指出我正确的方向吗 编辑 我已成功使用以下代码将 PEM 转换为 PublicKey 但在对消息进行编
  • 在OpenSSL中使用RSA公钥生成相应的私钥?

    我知道可以使用这个链接 https www ibm com support knowledgecenter en SSWHYP 4 0 0 com ibm apimgmt cmc doc task apionprem gernerate s
  • 解码 OAEP 填充时出错

    使用解密文本时RSACryptoServiceProvider Decrypt 我收到错误 解码 OAEP 填充时出错 这是我的代码 CspParameters cspParam new CspParameters cspParam new
  • X509 证书公钥填充

    我正在将一些 Java 代码移植到 C 但 Java 和 C 之间的公钥填充似乎不一致 这是我的Java代码 package Encryption import java security cert X509Certificate impo
  • 无法加载 RSA 公钥

    我正在尝试读取如下所示的 RSA 公钥 但在第 6 行出现异常 java security spec InvalidKeySpecException java security InvalidKeyException IOException
  • PHP使用RSA私钥解密数据

    我有一个程序 使用 C rsa 公钥加密密码 输出字节数组 为了让我轻松传输它并维护数据 我将字节直接转换为十六进制字符串 现在这就是我遇到问题的地方 我将发布数据发送到我的脚本 现在不确定将其转换为什么以及如何解密它 我正在尝试使用htt
  • 在 Android 中解密从 .net 生成的 RSA 加密值

    我在这里浏览了很多帖子 但没有找到正确的解决方案 我想从 Android 解密在 c net 中加密的值 我已使用以下代码片段在 net平台中成功解密 public static void Main string privateKey Ba
  • 从私钥中提取公钥

    我尝试通过以下方式以编程方式完成步骤 2 1 openssl genrsa out signing pem 2048 2 openssl rsa in signing pem outform PEM pubout out signing p
  • 健全性检查 SSH 公钥? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已要求用户提供他们的公共 id rsa pub ssh 密钥 然后将其放入 home theiraccount ssh authorized key
  • 无需动态分配的RSA实现

    典型的 RSA 实现包含一个多精度整数库 典型的多精度整数库使用动态分配将大整数表示为大小合适的机器字数组 我预计当使用多精度整数仅使用 RSA 2048 来加密或解密已知长度的消息 通常是对称加密密钥 时 可能会遇到数学整数的限制 并且它
  • Android 中的 RSA 加密

    我正在编写一个在 Android 中使用 RSA 的程序 我有以下问题 我正在获取 RSA 密钥 KeyPair kp kpg genKeyPair publicKey kp getPublic privateKey kp getPriva
  • iOS SecKeyRef(公钥)将其发送到服务器[重复]

    这个问题在这里已经有答案了 现在我的公钥有问题 我使用 SecKeyGeneratePair 来生成公钥和私钥 现在我必须将我的公钥发送到服务器 我使用下面的方法将 SecKeyRef 转换为 NSData 我总是得到相同的公钥 不过我将其
  • 如何使 RSACryptoServiceProvider 在没有填充(nopadding)的情况下工作?

    我需要使 C 应用程序与 Java 应用程序兼容 Java 应用程序使用Cipher getInstance RSA ECB nopadding 初始化器使密码 ECB 和无填充 但是 在 C 中 您有 2 个填充选项 OAEP 填充或 P

随机推荐

  • Linux grep之正则表达式

    文章目录 6 grep之正则表达式 1 自学书上的 2 课件上的 3 总结 6 grep之正则表达式 1 自学书上的 在正则表达式中 空格和其他字符没有什么区别 正则表达式识别的字符包括 如果要使用某个字符作为文本字符就必须要使用转义字符
  • 前方高能!这是最新的一波Android大厂面试题汇总,不学则已,一学惊人

    前言 面试大厂 那就是考察你技术方向的一些专业技能 如果你面试Android岗位 那 Android 方向的专业技能就是考察很重要的一个方向 但是话说回来 即便这条是所有人都知道的共识 也不是所有人都能搞得定 有些人就是觉得自己基础差 非科
  • XML - XML学习/XML文件解析器(C++)实现

    XML XML学习 XML文件解析器 C 实现 XML概述 XML是一套定义语义标记的规则 这些标记将文档分成许多部件并对这些部件加以标识 它也是元标记语言 用于定义其他与特定领域有关的 语义的 结构化的标记语言的句法语言 XML与HTML
  • 05-java常用api类

    1 String类 String 类在 java lang 包下 所以使用的时候不需要导包 String 类代表字符串 Java 程序中的所有字符串文字 例如 abc 都被实现为此类的实例也就是说 Java 程序中所有的双引号字符串 都是
  • UE4快速导入Blender模型——Send to Unreal 插件使用

    下载地址 https github com epicgames blendertools blender安装Send to Unreal插件 设置自定义路径 打开UE4 插件 搜索 Python Editor Script Plugin 勾
  • lua小结

    1 JIT可以编译优化清单 http wiki luajit org NYI 2 lua数组的下标是从1开始的 在没有指定赋值的情况下 C语言的数组下标是从0开始的 3 逻辑表达式and or not用法 local a b and C o
  • 【Leetcode】MySQL:数据库简单题(577 员工奖金)

    577 员工奖金 1 题目描述 选出所有bonus lt 1000 的员工的name及其bonus 2 具体实现 Write your MySQL query statement below left join null select na
  • Devs--开源规则引擎介绍

    Devs Devs是一款轻量级的规则引擎 开源地址 https github com CrankZ devs 基础概念 此规则引擎的基础概念有字段 条件 规则等 其中字段组成条件 条件组成规则 并且支持多个条件通过与或组成一个规则 下面用常
  • 一短文读懂编译型与解释型编程语言

    在编程世界中 我们经常听到编译型语言和解释型语言这两个术语 它们是什么 有什么区别呢 让我们一起来探讨一下 编译型语言 编译型语言 如C Java等 是一种需要先被编译成机器代码 然后才能被执行的语言 你可以把它想象成一个笔译员 他会先把你
  • 用电器分析识别装置(2021 年全国大学生电子设计竞赛H题)

    用电器分析识别装置 2021 年全国大学生电子设计竞赛H题 摘要 1 系统方案 1 1 用电器分析识别装置的原理和结构 1 2 方案论证 1 2 1 系统供电论证和选择 1 2 2 采样方法论证和选择 1 2 3 采样芯片的型号选择 1 3
  • 爆款短视频剪辑方法技巧,这样剪辑出来的短视频更容易爆,收藏

    爆款短视频剪辑方法推荐 这样剪辑出来的短视频更容易爆 前面几篇内容 我们从定位到脚本结构 再到选题 再到互动点和内容各方面都为短视频做好了素材准备 后续我们也开始知道怎么写自己的文案了 也告诉大家什么是一个好的表现力 还有我们的景别 我们的
  • 内核对象

    内核对象 1 什么是内核对象 内核对象是内核分配的一段空间 如文件对象和进程对象等 可以用Windows提供的函数来创建相应的内核对象 创建成功后返回一个对象句柄 并且对象句柄值是进程相关的 程序不能直接操作内核对象 只能通过Windows
  • MFC学习笔记 — C++如何执行.exe文件

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XX 作 者 文化人 XX 联系方式 或进群 471144274 XX 版权声明 原创文章 欢迎评论和转载 转载时能告
  • 随机森林实例(R语言实现)

    1 可以先查询一下路径 可以是数据所在的路径 需要更改路径的话用setwd 路径 2 安装需要的包并使用 install package 包名 library 包名 randomForest 随机森林包 caret 常用于机器学习 数据处理
  • 【22-23 春学期】人工智能基础--AI作业9-卷积3-XO识别

    1 For循环版本 手工实现 卷积 池化 激活 import numpy as np x np array 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
  • 基于51单片机的智能照明控制系统

    功能 基于51单片机的智能照明控制系统 以51系列单片机为核心 使用光敏传感模块 采用ADC0832对光敏电路进行AD转换 红外传感模块与声敏传感模块组成检测装置 并采用PWM对照明灯的光强度进行控制 1 本设计分为手动模式和自动模式 可通
  • MyBatis-Plus 3 实现批量新增和批量修改

    1 批量更新 mapper 接口 批量方法插入 void batchInsert Param users List
  • 智能合约开发solidity编程语言实例

    智能合约开发用solidity编程语言部署在以太坊这个区块链平台 本文提供一个官方实战示例快速入门 用例子深入浅出智能合约开发 体会以太坊构建去中心化可信交易技术魅力 智能合约其实是 执行合约条款的计算机交易协议 区块链上的所有用户都可以看
  • Cascader 级联选择组件

    乌鱼子 一开始级联组件使用的是ElementUI 但是有一个bug 我自己做的是一个二级级联 在选择了二级之后 点击x删除选择 再打开下拉框 一级和二级都是展开的 翻遍了文档都没有查到解决资料 然后问了我们一个前端同事 他说这是Elemen
  • 网站密码明文传输解决方案js+java

    解决密码明文传输的方案 基本有两种解决方案 1 将项目网站全站升级为https协议 如果要更谨慎 还需要加密 2 将密码进行加密后 在后台解密 因项目升级https时间周期太长 将暂时替代方案改为RSA加密解密方式 最简单的方案 前端加密