用户登录对密码进行加密

离开上家公司后才发现上家公司的网站 用户登录 对密码是没有任何加密的形式,自己整理了一下对密码加密的方法 如下:

不加密:

我们使用网络探测器能轻易的获取用户的用户名密码,如果这些信息被不发份子获得,后果可想而知;

用户登录对密码进行加密_第1张图片用户登录对密码进行加密_第2张图片

这里我们可以看到 密码是以明文的方式 被网络探测器 嗅到

现对密码进行加密,如果对用户也不希望明文显示也可以进行加密:代码如下:

java 后台代码:

生成公钥方法:

/**
     * 生成公钥
     * @return  
     * @throws Exception
     */
	@ClearInterceptor(ClearLayer.ALL)
    public void Rdspwd() throws Exception{
    	HttpServletResponse response = getResponse();;
        PrintWriter writer = response.getWriter();
        String publicKey = RSAUtils.generateBase64PublicKey();
        writer.write(publicKey);        
        renderNull();
    }
页面代码:我们在页面一加载的时候就Ajax请求生成公钥的方法

需要先在Javascript 中声明 公钥变量

//获取public key
 var publicKey = null;

function getPublicKey(dologin){
				$.ajax({
					url: "/login/Rdspwd",
	            	type: "post",
	            	dataType: "text",
	            	success: function(data) {
	            		if(data) publicKey = data;
	            		if(dologin==1){
	            			if(publicKey==null){
	            				$("#msg").html("获取publicKey失败,请联系管理员!");
	            				$("#login-btn").removeAttr("disabled");
	            			}else{
	            				doLogin(1);
	            			}
	            		}
	            	}
				});
			}

获取用户名和密码:

var ustring = $.trim($("#ustring").val());
var pstring = $.trim($("#pstring").val());

然后根据公钥进行私钥加密:

//进行加密
			        var encrypt = new JSEncrypt();
			        if(publicKey != null){
			            encrypt.setPublicKey(publicKey);
			            var password = encrypt.encrypt(pstring);
			            var username = encrypt.encrypt(ustring);
			            //提交之前,检查是否已经加密。假设用户的密码不超过20位,加密后的密码不小于20位
			            if(password.length < 20) {
			                //加密失败提示
			            	alert("登录失败,请稍后重试...");
			            }else{
			            	 $.ajax({
					 url: "${contextPath}/dologin",
				            	type: "post",
				            	data: {"usname": username,"pwd": password,"vcstring": vcstring},
				            	dataType: "json",
     }
 }

后台获取到加密后的用户名和密码后进行解密:

//解密帐号
username = RSAUtils.decryptBase64(username);
//解密密码
password = RSAUtils.decryptBase64(password);
RSAUtils 类:

public class RSAUtils {
	
	
	 //KeyPair is a simple holder for a key pair.
    private static final KeyPair keyPair = initKey();
    /**
     * 初始化方法,产生key pair,提供provider和random
     * @return KeyPair instance
     */
    private static KeyPair initKey() {

        try {
            //添加provider
            Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
            Security.addProvider(provider);
            //产生用于安全加密的随机数
            SecureRandom random = new SecureRandom();

            KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", provider);
            generator.initialize(1024, random); 
            return generator.generateKeyPair();
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }
    /**
     * 产生public key
     * @return public key字符串
     */
    public static String generateBase64PublicKey() {
        PublicKey publicKey = (RSAPublicKey)keyPair.getPublic();

        //encodeBase64(): Encodes binary data using the base64 
        //algorithm but does not chunk the output.
        //getEncoded():返回key的原始编码形式
        return new String(Base64.encodeBase64(publicKey.getEncoded()));
    }
    /**
     * 解密数据
     * @param string 需要解密的字符串
     * @return  破解之后的字符串
     */
    public static String decryptBase64(String string) {
        //decodeBase64():将Base64数据解码为"八位字节”数据
        return new String(decrypt(Base64.decodeBase64(string.getBytes())));
    }

    private static byte[] decrypt(byte[] byteArray) {
        try {
            Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
            Security.addProvider(provider);
            //Cipher: 提供加密和解密功能的实例
            //transformation: "algorithm/mode/padding"
            Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", provider);
            PrivateKey privateKey = keyPair.getPrivate();
            //初始化
            cipher.init(Cipher.DECRYPT_MODE, privateKey);
            //doFinal(): 加密或者解密数据
            byte[] plainText = cipher.doFinal(byteArray);
            return plainText;
        } catch(Exception e) {
            throw new RuntimeException(e);
        }
    }

}


 好了。 这样用户登录的 加密  和解密就完成了。 

前台页面加载时调用生成公钥方法 生成公钥, 然用户点击登录时获取用户输入的用户名、密码,根据之前生成的公钥 进行私钥加密,传入后台的数据是已经加过密的数据, 然后我们在后台在进行解密 ,得到用户输入的原始密码, 后面的就可以根据自己的业务需求进行处理。



你可能感兴趣的:(学习记录)