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

这篇具有很好参考价值的文章主要介绍了系统登录的时候的密码如何做到以加密的形式进行登录【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】工具类。,java,开发语言

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

总结:

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

给大家画个流程图:

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

最后:

如果大家觉得这篇文章对大家有所帮助的话,希望能给个免费的赞赞,也祝各位码农在未来的IT道路上能越走越远。谢谢。文章来源地址https://www.toymoban.com/news/detail-824873.html

到了这里,关于系统登录的时候的密码如何做到以加密的形式进行登录【java.security包下的api】工具类。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RSA加密:Web前端登录账户密码加密传输

        一般在做系统时候对安全性要求比较高,现在通常选择https协议来进行数据传输。很多情况下一般的javaweb网站,如果安全要求不是很高的话,用https协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为请求如果在传输过程中被截了,就可以直接拿明文密

    2024年02月10日
    浏览(61)
  • 三次输错密码后,系统是怎么做到不让我继续尝试的?

    忘记密码这件事,相信绝大多数人都遇到过,输一次错一次,错到几次以上,就不允许你继续尝试了。 但当你尝试重置密码,又发现新密码不能和原密码重复: 相信此刻心情只能用一张图形容: 虽然,但是,密码还是很重要的,顺便我有了一个问题:三次输错密码后,系统

    2024年02月04日
    浏览(29)
  • Jmeter的登录密码加密问题

    1.将加密逻辑jar包放在jmeter下 2.beanshell引用该jar包

    2024年02月14日
    浏览(33)
  • 某游戏登录密码加密,webpack

    网址(今天的大冤种): aHR0cHM6Ly93d3cuZ205OS5jb20v 从上面图片可以看到,他的密码是加密了,但是使用xhr断点又没断掉,所以使用事件监听器 鼠标移到登录位置,可以看到,然后点进去 打上断点 点击调试,下一步,下一步…直到看到这个 鼠标移上去,然后出现下面框框,点进

    2024年02月09日
    浏览(44)
  • spring boot如何实现对应用系统进行请求加密、响应加密处理

    参考文档:https://blog.csdn.net/zhuocailing3390/article/details/125054315 通过实现 RequestBodyAdvice 接口,对前端请求的参数进行解密并且重新让真实结构的数据进入到Controller中; 通过实现 ResponseBodyAdvice 接口,将响应的参数进行加密,返回到前端; 扩展: 可以通过自定义注解,实现对指

    2024年02月07日
    浏览(40)
  • 若依基于jsencrypt实现前后端登录密码加密

    若依虽然有加密解密功能,然后只有前端有,在用户点击保存密码的时候,会将密码保存到本地,但是为了防止密码泄露,所以在保存的时候,进行加密,在回显密码的时候进行解密显示,用户在登录的时候密码照样会明文传输,我们可以使用,为了解决这个问题,我们可以

    2024年01月17日
    浏览(47)
  • 每日网站逆向练习:day4 某安全中心登录密码加密

    某安全中心网站登录载荷中有2个参数需要破解 首先这个aws直接就是送的,不管是多试几次或者是直接去看他的方法,都可以发现这个值是写死的 不过点进去看他的方法好像也不简单,不过既然是写死的就不管他了 我们搜索后发现竟然只有一处,而且还并不是在对它赋值 不

    2024年02月05日
    浏览(61)
  • dcat-admin自定义登录密码hash加密规则

    config/admin.php

    2024年02月16日
    浏览(34)
  • vue前端对密码进行Rsa加密

    在信息技术发达的信息化世界,我们的敏感信息在各个平台都已进行注册使用。例如我们支付宝的支付密码、微信的支付密码、电子银行的登陆密码、我们的个人身份信息等等都会被不法分子利用。为了保障我们的身份不被暴露以及账户财产安全,研发人员使用了很多加密算

    2024年02月13日
    浏览(65)
  • VUE3、uni-app、SpringBoot登录密码加密

    aes.js import {Encrypt} from \\\'@/utils/aes.js\\\'; loginForm.value.password = Encrypt(password.value); new Aes().decrypt(loginBody.getPassword()) CryptoJS.js aes.js import {Encrypt} from \\\'@/utils/aes.js\\\' Encrypt(this.password)

    2024年02月08日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包