登录的时候避免密码明文

1.登录页面 前台先请求后台 获取 UUID及 公钥

2.后台利用RSA工具类生成公钥及私钥再生成一个UUID,把UUID当做key把秘钥存进缓存中并返回前台UUID及公钥

   String uuId = UuidUtil.get32UUID();
   HashMap<String, String> map = RSACrypt.getKeys();
   String publicKeyStr=map.get("publicKey");  //公钥
   String privateKeyStr=map.get("privateKey");//私钥
   redisUtils.set(uuId,privateKeyStr);

3.前台点击登录的时候 把 公钥及密码的明文放进JSEncrypt中进行加密,然后把加密后的密码及UUID返回后台

var publicKey = "公钥"
var pass = "密码"
var newPass="加密后数据"
// 新建JSEncrypt对象
 let encryptor = new JSEncrypt();
 // 设置公钥
 encryptor.setPublicKey(publicKey);
 // 加密数据
newPass =  encryptor.encrypt(pass );

4.后台再根据UUID把秘钥从缓存中取出,进行解密

String uuId="123";
String pass = "加密后的密码"
String passWordData= "解密后的密码"
String privateKeyStr = redisUtils.get(uuId);  //获取私钥
//别忘了删除缓存
redisUtils.dele(uuId)
passWordData=RSACrypt.decrypt(RSACrypt.loadPrivateKey(privateKeyStr),RSACrypt.strToBase64(pass ));

JSEncrypt :
安装:

npm install --save jsencrypt

引入:

import { JSEncrypt } from 'jsencrypt'

工具类:RSACrypt:

public class RSACrypt {

    /**
     * 生成RAS公钥与私钥字符串,直接返回
     *
     * @return
     */
    public static HashMap<String, String> getKeys() {
        HashMap<String, String> map = new HashMap<String, String>();
        KeyPairGenerator keyPairGen = null;
        try {
            keyPairGen = KeyPairGenerator.getInstance("RSA");
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        // 初始化密钥对生成器,密钥大小为96-1024位
        keyPairGen.initialize(1024, new SecureRandom());
        // 生成一个密钥对,保存在keyPair中
        KeyPair keyPair = keyPairGen.generateKeyPair();
        // 得到公钥字符串
        String publicKey = base64ToStr(keyPair.getPublic().getEncoded());
        // 得到私钥字符串
        String privateKey = base64ToStr(keyPair.getPrivate().getEncoded());
        map.put("publicKey", publicKey);
        map.put("privateKey", privateKey);
        return map;
    }

    /**
     * 根据公钥字符串加载公钥
     *
     * @param publicKeyStr 公钥字符串
     * @return
     * @throws Exception
     */
    public static RSAPublicKey loadPublicKey(String publicKeyStr) throws Exception {
        try {
            byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(publicKeyStr);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法", e);
        } catch (InvalidKeySpecException e) {
            throw new Exception("公钥非法", e);
        } catch (NullPointerException e) {
            throw new Exception("公钥数据为空", e);
        }
    }

    /**
     * 根据私钥字符串加载私钥
     *
     * @param privateKeyStr 私钥字符串
     * @return
     * @throws Exception
     */
    public static RSAPrivateKey loadPrivateKey(String privateKeyStr) throws Exception {
        try {
            byte[] buffer = javax.xml.bind.DatatypeConverter.parseBase64Binary(privateKeyStr);
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");
            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此算法", e);
        } catch (InvalidKeySpecException e) {
            throw new Exception("私钥非法", e);
        } catch (NullPointerException e) {
            throw new Exception("私钥数据为空", e);
        }
    }

    /**
     * 公钥加密
     *
     * @param publicKey     公钥
     * @param plainTextData 明文数据
     * @return
     * @throws Exception 加密过程中的异常信息
     */
    public static String encrypt(RSAPublicKey publicKey, byte[] plainTextData) throws Exception {
        if (publicKey == null) {
            throw new Exception("加密公钥为空, 请设置");
        }
        Cipher cipher = null;
        try {
            // 使用默认RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.ENCRYPT_MODE, publicKey);
            byte[] output = cipher.doFinal(plainTextData);
            return base64ToStr(output);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此加密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("加密公钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            throw new Exception("明文长度非法");
        } catch (BadPaddingException e) {
            throw new Exception("明文数据已损坏");
        }
    }


    /**
     * 私钥解密
     *
     * @param privateKey 私钥
     * @param cipherData 密文数据
     * @return 明文
     * @throws Exception 解密过程中的异常信息
     */
    public static String decrypt(RSAPrivateKey privateKey, byte[] cipherData) throws Exception {
        if (privateKey == null) {
            throw new Exception("解密私钥为空, 请设置");
        }
        Cipher cipher = null;
        try {
            // 使用默认RSA
            cipher = Cipher.getInstance("RSA");
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            byte[] output = cipher.doFinal(cipherData);
            return new String(output);
        } catch (NoSuchAlgorithmException e) {
            throw new Exception("无此解密算法");
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
            return null;
        } catch (InvalidKeyException e) {
            throw new Exception("解密私钥非法,请检查");
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
            throw new Exception("密文长度非法");
        } catch (BadPaddingException e) {
            e.printStackTrace();
            throw new Exception("密文数据已损坏");
        }
    }

    public static String base64ToStr(byte[] b) {
        return javax.xml.bind.DatatypeConverter.printBase64Binary(b);
    }

    public static byte[] strToBase64(String str) {
        return javax.xml.bind.DatatypeConverter.parseBase64Binary(str);
    }
}

这样就可以避免前后台传输密码的过程中出现明文的情况

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,通过以下步骤可以查看密码明文: 1. 打开终端:在任务栏或者菜单中找到终端应用程序并打开。 2. 运行特权命令:输入以下命令并按下回车键以切换到Root超级用户: ```shell sudo su ``` 3.切换到`/etc/shadow`文件所在的目录,该文件包含了加密后的用户密码以及其他相关信息。 ```shell cd /etc ``` 4. 使用文本编辑器,如vi或nano,打开`/etc/shadow`文件: ```shell vi /etc/shadow ``` 5. 在打开的文件中,可以看到每个用户的用户名和密码字段。密码字段通常以`$`符号开头,后面跟随一串加密后的密码字符。在`$`符号后面的字符表示所使用的加密算法。 6. 寻找要查看密码明文的用户。密码字段的格式一般为:`$id$salt$hashed_password`,其中`id`是加密算法的标识,`salt`是用于增加密码的复杂性的附加字符串。 7. 删除密码字段中的所有字符,只保留`$id$salt`部分。这样做是为了告诉系统将密码字段视为空值,以便在下一次登录时要求输入密码。 8. 保存并关闭文件。在vi编辑器中,按下`Esc`键,在命令行模式下输入`:wq`并按下回车键。 9. 现在,用户密码已被重置为空。在下一次登录时,系统将提示用户输入新密码。 需要注意的是,在Linux系统中,为了保护用户的密码安全,密码字段通常都是经过加密处理的,因此无法直接查看密码明文。上述方法只是通过重置密码字段为空值的方式实现了“查看”密码明文的效果,但实际上并非真正获取到明文密码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值