Ruoyi framework penetration testing username and password plain text transmission problem

Solution ideas, front-end js encryption, controller layer decryption

1. Front-end encryption

Introduce js (jsencrypt.min.js) personal backup js

function login() {
$.modal.loading($("#btnSubmit").data("loading"));
var username = $("input[name='username']").val().trim();
    var password = $("input[name='password']").val().trim();
    var validateCode = $("input[name='validateCode']").val();
    var rememberMe = $("input[name='rememberme']").is(':checked');
    $.ajax({
        type: "post",
        url: ctx + "login",
        data: {
            "username": username,
            "password": getP(password),
            "validateCode" : validateCode,
            "rememberMe": rememberMe
        },
        success: function(r) {

. . . . . . . . . . . . . . . Omit
function getP(pw){<!-- --><br>    var encrypt = new JSEncrypt();<br>    encrypt.setPublicKey("-----BEGIN PUBLIC KEY-----MIIBITANBgkqhkiG9w0BAQEFAAOCAQ4AMIIBCQKCAQBdGLuF0cP1mE8cuK24mp7qi5sSmNVSB0qdJiiw6jzkU + iH1 + bVJmFbuiAmYG/VOym6ZDftCy2R4oJvkP 7MgS1nsxBRdnb0eAU/abVy1Wk2y1d6ZsiF35Shpy235WfkIVc9cRX71LpNxetfMiFAJSqSZ2XbNJTBWZEah/r0rBgRSAkC6NbFsgdWi6VbPGDVM + Y2pM8wQjrUi3ZCTE9SSchv/grbl/OJm/T5ua YP0VqoOV0Zzi89bqjby9XexInyCj + 1hxy7 + 9NP1brx5qHRAuiidbtqHzVOyKpsKGPh2fJugbVhzUoqM6ebL/j1y8w92obMj3snsgykqj5T2kfSiiMxAgMBAAE=----- END PUBLIC KEY-----");<br>    var encryted = encrypt.encrypt(pw);<br>    return encryted;<br>}<br><br>The public key here can be placed at the end of jsencrypt.min.js and then retrieved here. I will write it directly here

Controller layer decryption code

@PostMapping("/login")<br>@ResponseBody<br>public AjaxResult ajaxLogin(String username, String password, Boolean rememberMe)<br>{<!-- --><br>    String repassword = "";<br>    //System.out.println("before decryption" + password);<br><br>    //Decrypt the passed password value<br>    try {<!-- --><br>         repassword = RSAUtil.decrypt(password,RSAUtil.PRIVATE_KEY);<br>        //System.out.println("After decryption" + repassword);<br>    } catch (Exception e) {<!-- --><br>        e.printStackTrace();<br>        return error("Illegal login");<br>    }<br>    UsernamePasswordToken token = new UsernamePasswordToken(username, repassword, rememberMe);<br>    Subject subject = SecurityUtils.getSubject();<br>    try{<!-- --><br>        subject.login(token);<br>        return success();<br>    }<br>    catch (AuthenticationException e)<br>    {<!-- --><br>        String msg = "Wrong user or password";<br>        if (StringUtils.isNotEmpty(e.getMessage()))<br>        {<!-- --><br>            msg = e.getMessage();<br>        }<br>        return error(msg);<br>    }<br>}

Tool class SHAUtil

package com.ruoyi.common.utils;<br><br>import org.apache.commons.codec.binary.Base64;<br><br>import javax.crypto.Cipher;<br>import java.security.*;<br>import java.security.interfaces.RSAPrivateKey;<br>import java.security.interfaces.RSAPublicKey;<br>import java.security.spec.PKCS8EncodedKeySpec;<br>import java.security.spec.X509EncodedKeySpec;<br>import java.util.HashMap;<br>import java.util.Map;<br><br>public class RSAUtil {<!-- --><br>    //public static String PRIVATE_KEY="MIIEoQIBAAMMMMMMMMMMMMMMMMFbuiAmYG/VOym6ZDftCy2R4oJvkP7MgS1nsxBRdnb0eAU/abVy1Wk2y1d6ZsiF35Shpy235WfkIVc9cRX71LpNxetfMiFAJSqSZ2XbNJTBWZEah/r 0rBgRSAkC6NbFsgdWi6VbPGDVM + Y2pM8wQjrUi3ZCTE9SSchv/grbl/OJm/T5uaYP0VqoOV0Zzi89bqjby9XexInyCj + 1hxy7 + 9NP1brx5qHRAuiidbtqHzVOyKpsKGPh2fJugbVhzUoqM6ebL/j 1y8w92obMj3snsgykqj5T2kfSiiMxAgMBAAECggEALujqfMixJEyl + IP6TV3kG61S63EFdHrmFv + GW3b8TdUWA3VABEF9p1nHH29SirBwG1Kqd5A9Wxg2v37hVSz2Mx2gaFv4HsFna4eZfY6ZoJ mfr7ag7gw1 + aqit9opmmNOcVBNUoLjiZLkQiihZpATvofJZEY/epnmKudABg + 9ZN86vnbA2DFnYmVLbZvWwhGyr7AnvDO + 678PtpIaWL4yxRA + p + 6CxQd5ZkQf8E6VGeU4qSmbksjN + fav1 SwDm4hGSBvHP6r2dWZ7MITg4DomavOwCJseh9AVX9LUtygumjY/NdYoUXkyoSeniQwL /uMd1ewB9Qi8jrJj9NAxUbsXDQKBgQCe2zRMi + R5u35FL2jWs/gAgT7KQ8d0vlv/eAOD2filiEGRoTgdzAXuGY0vytICf11HZ/y0qhPuiDuNIOnvIa9kj2zHawVBbm6Fl6J6GP874V894B h3J3oWn9ilMIfEjvM4Jlg6aKPiht1EiykLgvIim4qaFj8UTBMMkaqUZJjw6wKBgQCWBurdYj59dZ6XOlYZTDNjJriTm4MdOZrvxAOnYIdvtDcVhqWNcocR0OXYilwehLxnsbExbE3En4OmUb ZZe2pOvQ96OojUQHP4vwFUD3dm6gS87yT9nwDkMFgNETVbxVUI2SYsmtPnI8NgkkSiJfbj3Jlfe4ZCu4gwWJfD2WJVUwKBgDZW4XL1v3fsrOrZptEaytDRZTsnKElE/I9M7Fbj7uwgy d0Y + usmaTjjQKqChIgaLTxJ0 + Ww8BR + QXCrO5pzOV36uckVULzrG59TGV8OwfAnzb6Ks5O + y0KF90O6cBbKl2QzqaaBON46J + JUf/vSFSXFcwn2Zil5RGLeSS1to + t1AoGAcq6NAHfmDt9HQJ C+Wg4uxd9GfscEneV380oiBOM8BH59EP5hNNPUPiEyYam6KzYKEzX4njAM7n2FFDEoNBSsOc45s5RlHeK7A+12JXzBKDFBN++SljDibIwr8qkx4Znhm6bqkHQ2AV0ML5j/z/c3WA08TInPItnZjCNct 8BHc7MCgYAsV4y3/CtQEmxk3wQr8ng/4LZtHuXdojh8ZQ74b3gQqO/iml6XdzZJRN/fmO + ikDAY6jPQAW4RsqZ1l8W1pKbzCvuTW6jGoUyti + Lrt3HDF9SlZMHk4gc/ tq1/ad4lIgHbCxBJv7UvP6YDQX + 7itJmpmYmhTuYuJ11ZnAZg9qCQg==";<br>    public static String PRIVATE_KEY="MIIEuwNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNgEAAoIBAF0Yu4XRw/WYTxy4rbianuqLmxKY1VIHSp0mKLDqPORT6IfX5tUmYVu6ICZgb9U7KbpkN + 0LLZHigm + Q/syBLWezEFF2dvR4BT9ptXLVaT bLV3pmyIXflKGnLbflZ + QhVz1xFfvUuk3F618yIUAlKpJnZds0lMFZkRqH + vSsGBFICQLo1sWyB1aLpVs8YNUz5jakzzBCOtSLdkJMT1JJyG/ + CtuX84mb9Pm5pg/RWqg5XRnOLz1uqNvL1 d7EifIKP7WHHLv700/VuvHmodEC6KJ1u2ofNU7IqmwoY + HZ8m6BtWHNSiozp5sv + PXLzD3ahsyPeyeyDKSqPlPaR9KKIzECAwEAAQKCAQAu6Op8yLEkTKX4g/pNXeQbrVLrcQV0euYW/4ZbdvxN1RYDdUAEQX 2nWccfb1KKsHAbUqp3kD1bGDa/fuFVLPYzHaBoW/gewWdrh5l9jpmgmZ + vtqDuDDX5qqK32imaY05xUE1SguOJkuRCKKFmkBO + h8lkRj96meYq50AGD71k3zq + dsDYMWdiZUttm9bCEbKvsCe8M77r vw + 2khpYvjLFED6n7oLFB3lmRB/wTpUZ5TipKZuSyM359q/ VLAObiEZIG8c/qvZ1ZnswhODgOiZq87AImx6H0BVf0tS3KC6aNj811ihReTKhJ6eJDAv + 4x3V7AH1CLyOsmP00DFRuxcNAoGBAJ7bNEyL5Hm7fkUvaNaz + ACBPspDx3S + W/94A4PZ + KWIQ ZGhOB3MBe4ZjS/K0gJ/XUdn/LSqE + 6IO40g6e8hr2SPbMdrBUFuboWXonoY/zvhXz3gGHcnehaf2KUwh8SO8zgmWDpoo + KG3USLKQuC8iKbipoWPxRMEwyRqpRkmPDrAoGBAJYG6t1iPn11npc6VhlMM2M muJObgx05mu/EA6dgh2 + 0NxWGpY1yhxHQ5diKXB6EvGexsTFsTcSfg6ZRtll7ak69D3o6iNRAc/i/AVQPd2bqBLzvJP2fAOQwWA0RNVvFVQjZJiya0 + cjw2CSRKIl9uPcmV97hkK7iDBYl8P ZYlVTAoGANlbhcvW/d + ys6tmm0RrK0NFlOycoSUT8j0zsVuPu7CDJ3Rj66yZpOONAqoKEiBotPEnT5bDwFH5BcKs7mnM5Xfq5yRVQvOsbn1MZXw7B8CfNvoqzk77LQoX3Q7pwFsqXZ DOppoE43jon4lR/ + 9IVJcVzCfZmKXlEYt5JLW2j63UCgYByro0Ad + YO30dAkL5aDi7F30Z + xwSd5XfzSiIE4zwEfn0Q/mE009Q + ITJhqborNgoTNfieMAzufYUUMSg0FKw5zjmzlGUd4rsD7X YlfMEoMUE375KWMOJsjCvyqTHhmeGbpuqQdDYBXQwvmP /P9zdYDTxMic8i2dmMI1y3wEdzswKBgCxXjLf8K1ASbGTfBCvyeD/gtm0e5d2iOHxlDvhveBCo7 + KaXpd3NklE39 + Y76KQMBjqM9ABbhGypnWXxbWkpvMK + 5NbqMahTK2L4uu3ccMX 1KVkweTiBz + 2rX9p3iUiAdsLEEm/tS8/pgNBf7uK0mamZiaFO5i4nXVmcBmD2oJC";<br>    public static String PUBLIC_KEY="MIIBITANBgkqhkiKKKKKKKKKKKKKKKKKKKKKKKKKKKKKi5sSmNVSB0qdJiiw6jzkU + iH1 + bVJmFbuiAmYG/VOym6ZDftCy2R4oJvkP7MgS1nsxBRdnb0eAU/abVy1Wk2y1d6ZsiF35Sh py235WfkIVc9cRX71LpNxetfMiFAJSqSZ2XbNJTBWZEah/r0rBgRSAkC6NbFsgdWi6VbPGDVM + Y2pM8wQjrUi3ZCTE9SSchv/grbl/OJm/T5uaYP0VqoOV0Zzi89bqjby9XexInyCj + 1hxy7 + 9NP1brx5qHRAuiidbtqHzVOyKpsKGPh2fJugbVhzUoqM6ebL/j1y8w92obMj3snsgykqj5T2kfSiiMxAgMBAAE=";<br>    private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //Used to encapsulate randomly generated public and private keys<br>/* public static void main(String[] args) throws Exception {<!-- --><br>        //Generate public and private keys<br>        genKeyPair();<br>        //encrypt string<br>        String message = "testmsg";<br>        System.out.println("The randomly generated public key is:" + keyMap.get(0));<br>        System.out.println("The randomly generated private key is:" + keyMap.get(1));<br>        String messageEn = encrypt(message,keyMap.get(0));<br>        System.out.println("Plain text:" + message);<br>        System.out.println("The encrypted string is:" + messageEn);<br>        String messageDe = decrypt(messageEn,keyMap.get(1));<br>        System.out.println("The restored string is:" + messageDe);<br>    }*/<br><br>    /**<br>     * Randomly generate key pair<br>     * @throws NoSuchAlgorithmException<br>     */<br>    public static void genKeyPair() throws NoSuchAlgorithmException {<!-- --><br>        // The KeyPairGenerator class is used to generate public and private key pairs and generate objects based on the RSA algorithm.<br>        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");<br>        // Initialize the key pair generator, the key size is 96-1024 bits<br>        keyPairGen.initialize(1024,new SecureRandom());<br>        // Generate a key pair and save it in keyPair<br>        KeyPair keyPair = keyPairGen.generateKeyPair();<br>        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // Get the private key<br>        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // Get the public key<br>        String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded()));<br>        // Get the private key string<br>        String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded())));<br>        //Save the public key and private key to Map<br>        keyMap.put(0,publicKeyString); //0 represents the public key<br>        keyMap.put(1,privateKeyString); //1 represents the private key<br>    }<br>    /**<br>     * RSA public key encryption<br>     *<br>     * @param str<br>     * Encrypted string<br>     * @param publicKey<br>     * Public key<br>     * @return ciphertext<br>     * @throwsException<br>     * Abnormal information during encryption process<br>     */<br>    public static String encrypt( String str, String publicKey ) throws Exception{<!-- --><br>        //base64 encoded public key<br>        byte[] decoded = Base64.decodeBase64(publicKey);<br>        RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));<br>        //RSA encryption<br>        Cipher cipher = Cipher.getInstance("RSA");<br>        cipher.init(Cipher.ENCRYPT_MODE, pubKey);<br>        String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));<br>        return outStr;<br>    }<br><br>    /**<br>     * RSA private key decryption<br>     *<br>     * @param str<br>     * Encrypted string<br>     * @param privateKey<br>     *Private key<br>     * @return inscription<br>     * @throwsException<br>     * Abnormal information during decryption process<br>     */<br>    public static String decrypt(String str, String privateKey) throws Exception{<!-- --><br>        //64-bit decoded encrypted string<br>        byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));<br>        //base64 encoded private key<br>        byte[] decoded = Base64.decodeBase64(privateKey);<br>        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));<br>        //RSA decryption<br>        Cipher cipher = Cipher.getInstance("RSA");<br>        cipher.init(Cipher.DECRYPT_MODE, priKey);<br>        String outStr = new String(cipher.doFinal(inputByte));<br>        return outStr;<br>    }<br>}<br><br>

Public key and private key generation address

https://www.bm8.com.cn/webtool/rsa/

The generated key needs to be formatted

Convert key format to pksc8

http://tool.chacuo.net/cryptrsapkcs1pkcs8