精华内容
下载资源
问答
  • 关键信息明文传输也是一个十分常见的漏洞。在前后端进行交互时,尤其是登录操作,需要注意对密码等关键信息进行加密,因为信息在传输过程中,可能会有被截获的危险。下面就针对扫描工具,给出几种方案。 修复方案 ...

    漏洞说明

    关键信息明文传输也是一个十分常见的漏洞。在前后端进行交互时,尤其是登录操作,需要注意对密码等关键信息进行加密,因为信息在传输过程中,可能会有被截获的危险。下面就针对扫描工具,给出几种方案。

    修复方案

    • 第一种 base64

      严格来说,base64其实算不上加密?毕竟base64只是一种常见的编码格式,但是对于安全性要求不太高的系统,也可以使用base64来避免漏洞扫描工具报出“关键信息明文传输”的漏洞。base64使用简单,直接贴代码如下:
    		//前端进行加密编码
    		var b = new Base64();
    		var password_encode = b.encode(trim(password.value));
    		document.getElementById("password").value=password_encode;
    
    		//后端进行解密编码
    		password = PasswordUtils.getFromBase64(password);
    
    		//解码具体方法
    		public static String getFromBase64(String str)
       	 	{
            	byte[] b = null;
            	String result = null;
            	if (str != null)
            	{
                	BASE64Decoder decoder = new BASE64Decoder();
                	try
               	 	{
                    	b = decoder.decodeBuffer(str);
                    	result = new String(b, "UTF-8");
                	}
                	catch (Exception e)
                	{
                    	e.printStackTrace();
                	}
            	}
            	return result;
        	}
    
    	//前端加密,秘钥长度需为16位,这里我使用当前系统时间+abc构成的16位字符串做秘钥,并将秘钥存入Session中
    	<%
     		String key = Long.toString(new Date().getTime()) + "abc";
     		session.removeAttribute("AESKey");
     		session.setAttribute("AESKey", key);
     	%>
     	var password = document.getElementById("password").value;
     	var aeskey = CryptoJS.enc.Utf8.parse("<%= key%>");
        var srcs = CryptoJS.enc.Utf8.parse(password);  
        var encrypted = CryptoJS.AES.encrypt(srcs, aeskey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
        document.getElementById("password").value = encrypted.toString();
    
    //后端解密
    	password = PasswordUtils.decryptAES(request, password);
    
    /**
         * AES解密
         * @param req 用户请求,用于获取session中的aeskey
         * @param data 需要解密的数据
         * @return 返回解密的数据
         * @throws Exception
         */
        public static String decryptAES(HttpServletRequest req, String data) throws Exception {
            try {
            	HttpSession session = req.getSession();
            	String key = StringUtil.ob2string(session.getAttribute("AESKey"));
            	
                byte[] encrypted1 = new BASE64Decoder().decodeBuffer(data);
    
                Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
                SecretKeySpec keyspec = new SecretKeySpec(key.getBytes(), "AES");
    
                cipher.init(Cipher.DECRYPT_MODE, keyspec);
    
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original);
                return originalString;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    

    另外补一个注意事项,对于AES三中数据填充方式:

    • PKCS7Padding
      Java不支持此方式
      PKCS7Padding是缺几个字节就补几个字节的0

    • PKCS5Padding
      JS不支持此方式
      PKCS5Padding是缺几个字节就补充几个字节的几,例如缺8个字节,就补充8个字节的8

    • NOPadding
      不补充字节

    • 第三种 Https

      有些时候,不仅仅是密码,很多其它的信息也会被漏洞扫描工具认为是“敏感信息”,在这种情况下一一对这些数据加密显然是不现实的,因此,最好的办法就是关闭http协议通信而采用https通信,保证信道的安全,从而保证关键信息的安全。

    展开全文
  • 本地加密传输介绍http超文本传输协议(HTTP)被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密。因此HTTP协议不适合传输一些敏感信息,比如:密码登录支付交易、敏感...

    本地加密传输介绍

    http

    • 超文本传输协议(HTTP)被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密。

    • 因此HTTP协议不适合传输一些敏感信息,比如:密码登录支付交易、敏感信息查询等环节。

    https

    • Https协议是以通信安全为目标而创建的通信协议,即在HTTP协议下加入SsL(SecureSocketsLayer)安全套接层协议。

    • 简单来说,Https协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,它要比HTTP协议安全。

    https通信步骤

    • 客户使用https的URL访问web服务器,要求与Web服务器建立SSL连接。

    • Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端

    • 客户端的浏览器与web服务器开始协商SSL连接的安全等级,也就是信息加密的等级

    • 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。

    • web服务器利用自己的私钥解密出会话密钥。

    • Web服务器利用会话密钥加密与客户端之间的通信

    88cc457c9b6f18b891358ece808517cd.png

    不安全传输描述

    • 当系统对敏感交互操作业务未配置 Https协议,会导致攻击者可截取用户Web浏览器与网站服务器之间的HTTP传输报文,攻击者可以直接读取其中的敏感信息。

    漏洞危害

    • 系统用户登录明文传输

    • 敏感信息明文查询

    • 支付交易明文传输

    流程图

    968641fed552e65b74fa9ff45efeaf5b.png

    防御方案

    • 为存在敏感数据交互业务的应用服务器部署有效的SSL证书服务。

    摘抄

    为别人活着,也要为自己活着。

    希望和悲伤,都是一缕光。

    总有一天,我们会再相遇。

    -- 《云边有个小卖部》

    展开全文
  • WEB登录密码明文传输的严重性... 1 JS实现 RSA非对称加密算法... 1 加解密及传输流程... 1 后台产生一对公钥下发给WEB页... 2 WEB页JS调用公钥进行加密提交... 2 后台校验密码不能为空... 3

    paip.提升安全---绝大多数网站的登录高危漏洞解决方案

     

    作者Attilax 1466519819@qq.com

     

    WEB登录密码明文传输的严重性... 1

    JS实现 RSA非对称加密算法... 1

    加解密及传输流程... 1

    后台产生一对公钥下发给WEB... 2

    WEBJS调用公钥进行加密提交... 2

    后台校验密码不能为空... 3

    解密密码... 4

    密码编码器pwdEncode大部分原码... 4

    参考:6

    WEB登录密码明文传输的严重性

    今天,几乎所有的网站都有登录注册模块,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合。

     

    JS实现 RSA非对称加密算法

    所以,很多安全要求较高的网站都不会明文传输密码,它们会使用https来确保传输过程的安全,https是用证书来实现的,证书来自于证书颁发机构,当然了,你也可以自己造一张证书,但这样别人访问你的网站的时候还是会遇到麻烦,因为你自己造的证书不在用户浏览器的信任范围之内,你还得在用户浏览器上安装你的证书,来让用户浏览器相信你的网站,很多用户并不知道如何操作,就算会操作,也能也不乐意干;另一种选择是你向权威证书颁发机构申请一张证书,但这样有一定的门槛,还需要付费,也不是我们乐意干的事。

     

    所以使用JS来实现RSA加密是个很好的方法..我的网站是ASPNET.. 真正的难点在于用javascript实现一个和.netRSA兼容的算法

     

     

    加解密及传输流程

    后台产生一对公钥私钥

    传给WEB页面

    登录/注册的时候,使用JS加密

    后台解码.

     

     

    后台产生一对公钥下发给WEB

      protected void Page_Load(object sender, EventArgse)

        {

           

     

     

            pwdEncode pe= new pwdEncode();

            string[] ret=pe.PublicKey();

            strPublicKeyExponent=ret[0];

            strPublicKeyModulus=ret[1];

          

        }

        protected string strPublicKeyExponent="";

        protected string strPublicKeyModulus="";

     

     

    WEBJS调用公钥进行加密提交

     

    //两个加密文本框,加密后的密码保存在这里..如果是登录页面,只需要一个就可以了

                       <input name="encrypted_pwd" type="hidden" id="encrypted_pwd" />

                              <input name="encrypted_pwd2" type="hidden" id="encrypted_pwd2" />

     

    //调用相关JS

                              <SCRIPT type=text/javascript src="/index_files/Account.js"></SCRIPT>

               <script src="/Scripts/jQuery.md5.js" type="text/javascript" ></script>

                     <script src="/Scripts/BigInt.js" type="text/javascript"></script>

                        <script src="/Scripts/RSA.js" type="text/javascript"></script>

                              <script src="/Scripts/Barrett.js" type="text/javascript"></script>

             <script>

     

    //从后台得到公钥

    var strPublicKeyExponent="<%= strPublicKeyExponent%>";

    var strPublicKeyModulus="<%=strPublicKeyModulus%>";

     

     

    //加密函数

    function cmdEncrypt() {

                setMaxDigits(129);

                var key = new RSAKeyPair(strPublicKeyExponent, "", strPublicKeyModulus);

                var pwdMD5Twice = $("#SignIn_Pword").attr("value");

                var pwdRtn = encryptedString(key, pwdMD5Twice);

                $("#encrypted_pwd").attr("value", pwdRtn);

                        

           //注意:需要清空原密码框

                           $("#SignIn_Pword").attr("value","");

                       

     

           

    }

     

    //登录按扭事件

    function  login_click()

    {

     cmdEncrypt() ;

     return true;

    }

     

    //登录按扭事件注册

    $('#SignIn_SignInClt').click=login_click;

    $('#SignIn_SignInClt').click(function(){

      login_click();

    });

     

     

    后台校验密码不能为空

    因为使用了加密方式,所以原来的校验需要去掉,使用新的校验方式

     

                loginCheckor lc= new loginCheckor();

                lc.check(Account, Request["encrypted_pwd"]);

     

    public bool check(string uname,string pwd)

     

        {

            if (uname=="")

            {

                throw new SystemException("¨º?¡äº?¨?");

            }

          //  if(uname==null|| uname.Equals(""))

            if (pwd== null ||pwd.Equals(""))

                throw new Exception("¨¹??¨¹a?");

            //

            //TODO: ¨²ä?ä|¬¨ª¨®1¨¬¡¥ºy?-

            //

            return true;

        }

     

     

     

    如果是注册页面

     

      //ati L921 am

            

                pwdEncode pe= new pwdEncode();

                pe.checkEmpty(Request["encrypted_pwd"], Request["encrypted_pwd2"]);

                string pwd=pe.getPwd(Request["encrypted_pwd"]);

                string Pword2=pe.getPwd(Request["encrypted_pwd2"]);

                pe.check(pwd, Pword2);  //检测两个密码是否相同

                //不能直接检测参数,因为公钥加密后的两个参数不同,需要解密后进行比较

     

    解密密码

    -------登录后台

         pwdEncode pe= new pwdEncode();

            

                Pword=pe.getPwd(Request["encrypted_pwd"]);

     

     

    密码编码器pwdEncode大部分原码

    //这里主要使用session来保存RSA加密器和私钥

    //发送公

    public string[] sendPublicKey()

        {

            RSACryptoServiceProvider rsa;

            if (HttpContext.Current.Session["rsa"] != null)

                rsa= (RSACryptoServiceProvider)HttpContext.Current.Session["rsa"];

            else

                rsa= new RSACryptoServiceProvider();

     

            //if (string.Compare(Request.RequestType, "get", true) == 0)

            {

                //???ä?SessionD

                HttpContext.Current.Session["private_key"] =rsa.ToXmlString(true);

                HttpContext.Current.Session["rsa"] =rsa;

            }

            //ã???º¨ºÌ¡ÀÁa?ê?Á?À?¤¡éª¨´¨ª¡ì?

            pwdEncode pe= new pwdEncode();

            RSAParameters parameter=rsa.ExportParameters(true);

      string      strPublicKeyExponent=pe.BytesToHexString(parameter.Exponent);

      string strPublicKeyModulus=pe.BytesToHexString(parameter.Modulus);

      string[] r= new string[2];

      r[0] =strPublicKeyExponent;

      r[1] =strPublicKeyModulus;

     

      return r;

     

     

        }

     

    //解密函数

    private static string getDecodePwd(string pwd)

        {

            RSACryptoServiceProvider rsa;

     

            rsa= (RSACryptoServiceProvider)HttpContext.Current.Session["rsa"];

            pwdEncode pe= new pwdEncode();

            //   RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

            string strPwdToDecrypt=pwd;

            rsa.FromXmlString((string)HttpContext.Current.Session["private_key"]);

            byte[] result=rsa.Decrypt(pwdEncode.HexStringToBytes(strPwdToDecrypt), false);

            System.Text.ASCIIEncodingenc= new ASCIIEncoding();

            string strPwdMD5=enc.GetString(result);

            return strPwdMD5;

        }

     

     

    参考:

    RSA加密实现Web登录密码加密传输 - guogangj - 博客园

    展开全文
  • 浅谈“密码明文传输

    千次阅读 2020-07-19 10:21:50
    明文传输一般存在于web网站登陆页面,用户名密码采取明文传输并未采取加密(注意:一些软件如BurpSuite带有可加密的暴力破解!)容易被嗅探软件截取(如果加密方式是常见的加密也可以解密的(比如:MD5,RSA等--另外...

    一:漏洞名称:

    密码明文传输

    描述:

    明文传输一般存在于web网站登陆页面,用户名密码采取明文传输并未采取加密(注意:一些软件如BurpSuite带有可加密的暴力破解!)容易被嗅探软件截取(如果加密方式是常见的加密也可以解密的(比如:MD5,RSA 等--另外base64只是一种编码方式并不算是加密!)

    检测条件:

    已知Web网站具有登录页面

    检测方法:

    1. 找到网站或者web系统登录页面。
    2. 通过过对网站登录页面的请求进行抓包,工具可用burp、wireshark、filder、等等,分析其数据包中相关password(密码)参数的值是否为明文。

    ①如图利用wireshark抓包分析的密码:

    ②如图利用BurpSuite抓包分析的密码:(借用这位博主的图片 Hk.Ty

    ③如图利用火狐浏览器的F12中的“网络”模块功能并点击HTML进行筛选,抓包分析的密码

       然后点击登录即可获取到post或者get的请求头及请求主体的内容,如下图所示,就获取到了http明文登录的敏感数据了。

     

    漏洞修复:

    建议按照网站的密级要求,需要对密码传输过程中进行加密得使用加密的方式传输,如使用HTTPS,  但加密的方式增加成本,或许会影响用户体验。如果不用 HTTPS,可以在网站前端用 Javascript 做密码加密,加密后再进行传输。

    其他补充说明:

    暂无。

     

    展开全文
  • 用RSA加密实现Web登录密码加密传输 通常我们做一个Web应用程序的时候都需要登录,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等...
  • 八成网站登录口令“裸身待缚” 电商类全军覆没,在用户口令传输过程中,仍然存在很多隐患。一般而言,用户在登录网站,输入用户名和密码之后,从用户电脑传输到网站服务器,会经过口令传输、口令存储认证等过程。而...
  • 目的:防止登录密码名文传输(仅仅只是防止明文传输,加密效果取决于key,而key对于前台是透明的)方式:前端页面用js加密前端登录密码,采用AES对称加密一、前端JS加密库crypto-js因为懒,所以直接引入整个加密库,...
  • 登录时候向服务器传递的是明文 username:张三 ...现在就有了个问题,传输过程中是明文传输的,不安全。如何将它转变为密文传输? 如果我直接在客户端写个代码,通过源码也能看到,起不到加密作用

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
热门标签
关键字:

web登录明文传输