系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。

/*
     * @description: 将普通的publicKey转化得到一个RSAPublicKey
     * @author: zkw
     * @date: 2024/1/24 16:17
     * @param: publicKey 普通的publicKey
     * @return: RSAPublicKey 得到一个新的RSAPublicKey
     **/
    public static RSAPublicKey getPublicKey(String publicKey) throws NoSuchAlgorithmException, InvalidKeySpecException {
        //通过X509编码的Key指令获得公钥对象
        KeyFactory keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(Base64.decodeBase64(publicKey));
        RSAPublicKey key = (RSAPublicKey) keyFactory.generatePublic(x509KeySpec);
        return key;
    }


    /*
     * @description: 将明文字符串利用RSAPublicKey公钥加密成一个密文
     * @author: zkw
     * @date: 2024/1/24 16:24
     * @param: data 待加密的明文字符串
     * @param: publicKey RSAPublicKey
     * @return: String 密文字符串
     **/
    public static String publicEncrypt(String data, RSAPublicKey publicKey) {
        try {
            Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            return Base64.encodeBase64URLSafeString(rsaSplitCodec(cipher, Cipher.ENCRYPT_MODE, data.getBytes(CHARSET), publicKey.getModulus().bitLength()));
        } catch (Exception e) {
            throw new RuntimeException("error......", e);
        }
    }

    /*
     * @description: 将普通的privateKey转化得到一个RSAPrivateKey
     * @author: zkw
     * @date: 2024/1/24 16:41
     * @param: privateKey 普通的privateKey
     * @return: RSAPrivateKey 得到一个新的RSAPrivateKey
     **/
    public static RSAPrivateKey getPrivateKey(String privateKey) {
        // 通过PKCS#8编码的Key指令获得私钥对象
        KeyFactory keyFactory;
        RSAPrivateKey rsaPrivateKey;
        try {
            keyFactory = KeyFactory.getInstance(RSA_ALGORITHM);
            PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
            rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8KeySpec);
        } catch (Exception e) {
            throw new ServiceException(Codes.PASSWORD_DECRYPTION_EXCEPTION);
        }
        return rsaPrivateKey;
    }

    /*
     * @description: 将密文使用私钥进行解密 解密出明文
     * @author: zkw
     * @date: 2024/1/24 16:42
     * @param: cipherText 密文
     * @param: privateKey RSAPrivateKey私钥
     * @return: String 明文
     **/
    private static String privateDecrypt(String cipherText, RSAPrivateKey privateKey) {
        try {
            Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            return new String(rsaSplitCodec(cipher, Cipher.DECRYPT_MODE, Base64.decodeBase64(cipherText), privateKey.getModulus().bitLength()), CHARSET);
        } catch (Exception e) {
            throw new ServiceException(Codes.PASSWORD_DECRYPTION_EXCEPTION);
        }
    }

rsaSplitCodec()方法

private static byte[] rsaSplitCodec(Cipher cipher, int opmode, byte[] datas, int keySize) {
        int maxBlock = 0;
        if (opmode == Cipher.DECRYPT_MODE) {
            maxBlock = keySize / 8;
        } else {
            maxBlock = keySize / 8 - 11;
        }
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        int offSet = 0;
        byte[] buff;
        int i = 0;
        try {
            while (datas.length > offSet) {
                if (datas.length - offSet > maxBlock) {
                    buff = cipher.doFinal(datas, offSet, maxBlock);
                } else {
                    buff = cipher.doFinal(datas, offSet, datas.length - offSet);
                }
                out.write(buff, 0, buff.length);
                i++;
                offSet = i * maxBlock;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        byte[] resultDatas = out.toByteArray();
        IOUtils.closeQuietly(out);
        return resultDatas;
    }

四个方法我直接贴出来,两个方法是关于公钥的,两个方法是关于私钥的

我们写一个测试方法,看看明文加密之后的密文,在经过解密后的明文是否一致。

public static void method(String clearPassword) throws NoSuchAlgorithmException, InvalidKeySpecException {
        //【前端通过js】 1、生成一个普通的PublicKey,一般这里前端会生成,同时也需要转化成一个RSAPublicKey,然后再对输入的明文字符串进行加密成一个密文,这里我不知道前端怎么写,我们就以后端的思路去代替
        KeyPair keyPair = KeyPairGenerator.getInstance(RSA_ALGORITHM).generateKeyPair();
        String publicKey = new String(java.util.Base64.getEncoder().encode(keyPair.getPublic().getEncoded()));
        RSAPublicKey rsaPublicKey = getPublicKey(publicKey);
        String cipherText = publicEncrypt(clearPassword, rsaPublicKey);//密文字符串

        //【后端通过代码】2、生成一个普通的PrivateKey
        String privateKey = new String(java.util.Base64.getEncoder().encode(keyPair.getPrivate().getEncoded()));

//        //3、将普通的privateKey转化为一个新的RSAPrivateKey
        RSAPrivateKey rsaPrivateKey = getPrivateKey(privateKey);
//
//        //4、对前端传过来的密文利用RSA私钥进行解密
        String res = privateDecrypt(cipherText, rsaPrivateKey);
        System.out.println("加密之前的明文:" + clearPassword);
        System.out.println("加密之后的密文:" + cipherText);
        System.out.println("================================");
        System.out.println("解密之后的明文:" + res);
    }

运行结果:

所以以后在登录的时候呢,前端会对界面输入的明文密码进行公钥加密成密文密码,然后再传给后端,后端就会利用私钥进行解密解密出明文密码,然后与数据库的进行比较。

总结:

使用java.security包下的api进行密码的加密传输(公加私解)

给大家画个流程图:

最后:

如果大家觉得这篇文章对大家有所帮助的话,希望能给个免费的赞赞,也祝各位码农在未来的IT道路上能越走越远。谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/345900.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力? 可能很多初学者在学完 SpringBoot 之后,做了 1-2 个项目之后,不知道该去学习什么了,其实这时候需要去学习的东西还有很多,接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…

C++补充篇- C++11 及其它特性

目录 explicit 关键字 左值和右值的概念 函数返回值当引用 C11 新增容器 - array C的类型转换 static_cast reinterpret_cast dynamic_cast const_cast C智能指针 auto_ptr 使用详解 (C98) unique_ptr 使用详解 (C11) auto_ptr的弊端 unique_ptr严谨auto_ptr的弊端 unique_…

网安培训第二期——sql注入+中间件+工具

文章目录 宽字节注入插入注入二次注入PDO模式(动态靶机!!!!!!!)sql注入读取文件sql注入导出文件linux命令 10.12笔记sqlmapsqlmap参数 10.13笔记sqlmap 文件读写前后缀常用tamper及适用场景 10.…

SpringMVC-RESTFul

文章目录 RESTFul一、基础概念二、增删改查1.查询全部用户信息 (GET)2.根据id查询用户信息3.添加用户(POST)4.修改用户 (PUT)5.删除用户 (DELETE) RESTFul 一、基础概念 二、增删改…

Qt Designer教程

文章目录 创建一个 ui 文件选择控件Qt Designer基本控件介绍1、Layouts1.1、Layouts 布局1.2、参数配置 2、Spacers2.1、 Spacers 弹簧介绍2.2、 参数设置 3、Buttons 按键3.1、 Buttons 按键分类 4、Item Views(Model-Based) 项目视图(基于模型)4.1、 B…

高质量简历模板网站,免费、免费、免费

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历…

shell脚本基础之条件语句详解

目录 一、条件语句 1、测试 1.1 测试判断 ​1.2 比较整数数值 1.3 字符串比较 1.4 双中括号的用法 1.5 () 与 {} 的用法及区别 2、if语句 2.1 单分支if语句 2.2 双分支if语句 2.3 多分支if语句 2.4 shell脚本的if语句案例 案例一 案例二 案例三 案例四 案例五…

c++day1作业

思维导图 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 要求使用C风格字符串完成 #include <iostream> #include <iomanip> using namespace std; int main() {string a;cout<<"输入一个字符…

vue3-深入组件-组件注册和props更多细节

组件注册 定义好的组件需要注册才能被使用。 注册方式有两种 全局注册 局部注册 全局注册 .component() 方法&#xff0c;让组件在当前 Vue 应用中全局可用。 在 main.ts 中 import ./assets/main.cssimport { createApp } from vue import { createPinia } from pinia i…

一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单

四川城市职业学院和陈老师在序号&#xff1a;158&#xff0c;300 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会名单 各相关单位&#xff1a; 一带一路暨金砖国家技能发展国际联盟大数据和人工智能专业委员会于2023年11月12日正式成立。经各单位申请、大数据…

kafka-顺序消息实现

kafka-顺序消息实现 场景 在购物付款的时候&#xff0c;订单会有不同的订单状态&#xff0c;对应不同的状态事件&#xff0c;比如&#xff1a;待支付&#xff0c;支付成功&#xff0c;支付失败等等&#xff0c;我们会将这些消息推送给消息队列 &#xff0c;后续的服务会根据订…

数据的存储结构

1.类别 顺序存储、链式存储、散列存储、索引存储 2.顺序存储与链式存储的区别 顺序存储链式存储优点 可以实现随机存取每个元素占用最少的空间 充分利用所有存储单元&#xff0c;不会出现碎片现象。缺点 只能使用整块的存储单元&#xff0c;会产出较多的碎片。 需要额外的存…

12.for 条件循环语句 (3)

for 循环语句 允许脚本一次性读取多个信息&#xff0c;然后逐一对信息进行操作处理。当要处理的数据有范围时&#xff0c;使用for循环语句。 使用 for 循环语句从列表文件中读取多个用户名&#xff0c;然后为其逐一创建用户账户并设 置密码。首先创建用户名称的列表文件users.…

Linux浅学笔记02

目录 grep-wc-管道符 echo-tail-重定向符 vi编辑器 grep-wc-管道符 grep命令(过滤文件内容) //更准确的来说&#xff0c;是筛选包括“所需字符”的一句内容或多句内容。 语法&#xff1a;grep [-n] 关键字 文件路径 //-n&#xff1a;可选&#xff0c;表示在结果中匹配的行…

如何防止联通光猫后台运营商远程自动改超管密码

环境: 联通光猫 ZXHN F677V9 硬件版本号 V9.0 软件版本号 V9.0.0P1T3 U盘16G 笔记本电脑 问题描述: 如何防止联通光猫后台运营商远程自动改超管密码 家里用的是ZXHN F677V9 光猫,自己改了超级密码之后用了几次,最近就无法登录了,问了装维师傅说是最近统一改了,这还…

模型之大脑和计算机的模型化

大脑和计算机的模型化 “素数分解&#xff1a;悬而未决的问题与计算机科学的挑战” 计算机同样也可以看作由相互作用的各部分集合而成&#xff1b;很大程度上由于这个原因&#xff0c;理论计算机科学中同样有很多悬而未决的重要问题。其中有如下这样一个例子&#xff0c;我们…

2023 工业 AR 关键词:纵深和开拓

2023 年&#xff0c;以虚实融合、工业元宇宙为代表的“新数字化”升级在工业制造领域达成共识。 ▲五部委联合印发元宇宙行动计划 通过发展元宇宙赋能新型工业化 而相对过去几年的行业渗透广、落地场景多样的 AR 业务拓展与合作&#xff0c;#纵深和#开拓&#xff0c;成为 2023…

网工内推 | 国企、合资公司IT专员,13薪,NA以上即可

01 上海新徐汇&#xff08;集团&#xff09;有限公司 招聘岗位&#xff1a;IT运维 职责描述&#xff1a; 1.负责制定网络体系搭建、IP地址分配、网络拓扑图、无线网络等&#xff1b; 2.负责桌面运维技术支持&#xff0c;确保各类系统和终端设备正常工作&#xff1b; 3.负责弱电…

构建中国人自己的私人GPT—与文档对话

先看效果 他可以从上传的文件中提取内容作为答案。上传文件摄取速度 摄取速度取决于您正在摄取的文档数量以及每个文档的大小。为了加快摄取速度&#xff0c;您可以在配置中更改摄取模式。 存在以下摄取模式&#xff1a; simple&#xff1a;历史行为&#xff0c;一次按顺序摄…

Bread:一款功能强大的BIOS逆向工程和高级调试工具

关于Bread Bread是一款功能强大的BIOS逆向工程和高级调试工具&#xff0c;该工具也是一个“可注入”的实模式&#xff08;Real-Mode&#xff09;x86调试器&#xff0c;可以帮助广大研究人员通过串行线缆从另一台电脑调试任意实模式代码。 考虑到目前社区中很多BIOS逆向工程工…
最新文章