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

5 篇文章 0 订阅
1 篇文章 0 订阅

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

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

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

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
根据提供的引用内容,Java信息安全风险评估主要包括以下方面: 1. 使用权限安全风险:包括使用方式提权、使用范围提权和使用类型提权等。 2. 使用角色安全风险:包括角色冒用等。 3. 使用服务可用性安全风险:包括查询服务被拒绝服务攻击等。 4. 数据传输安全风险:包括数据窃取和监听、数据明文传输等。 5. API数据服务接口安全风险:包括接口未鉴权、接口存在水平越权等。 6. 操作越权安全风险:包括数据使用未授权、数据使用范围未授权等。 7. 操作抵赖安全风险:包括数据操作行为冒充。 8. 操作滥用安全风险:包括数据被滥用、数据操作冒充他人等。 9. 操作泄漏安全风险:包括数据使用过程中恶意留存、恶意篡改数据等。 针对Java信息安全风险评估,可以采取以下解决方案: 1. 严格控制权限: 在应用程序中,确保只有经过授权的用户才能访问敏感数据和功能。 2. 加密数据传输: 使用安全的通信协议(如HTTPS)来加密数据在客户端和服务器之间的传输。 3. 强化身份验证: 使用多因素身份验证(如密码、指纹、令牌等)来确保用户身份的准确性和安全性。 4. 实施访问控制: 制定有效的访问控制策略,限制不同用户的权限和访问范围。 5. 定期审查和更新: 对应用程序进行定期审查,发现和修复可能存在的安全漏洞和风险。 6. 加强日志监控: 实施完善的日志记录和监控系统,及时检测和响应潜在的安全事件。 7. 培训和意识提升: 加强员工的信息安全教育培训,提高他们对安全风险的认识和防范意识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值