paip.提升安全---网站登录密码明文传输的登录高危漏洞解决方案
来源:互联网 发布:局域网文件同步软件 编辑:程序博客网 时间:2024/05/17 06:46
paip.提升安全---绝大多数网站的登录高危漏洞解决方案
作者Attilax, 1466519819@qq.com
WEB登录密码明文传输的严重性...1
JS实现 RSA非对称加密算法...1
加解密及传输流程...1
后台产生一对公钥下发给WEB页...2
WEB页JS调用公钥进行加密提交...2
后台校验密码不能为空...3
解密密码...4
密码编码器pwdEncode大部分原码...4
参考:6
WEB登录密码明文传输的严重性
今天,几乎所有的网站都有登录注册模块,登录就要输入用户名和登录密码,并且,用户名和登录密码都是明文传输的,这样就有可能在中途被别人拦截,尤其是在网吧等场合。
JS实现 RSA非对称加密算法
所以,很多安全要求较高的网站都不会明文传输密码,它们会使用https来确保传输过程的安全,https是用证书来实现的,证书来自于证书颁发机构,当然了,你也可以自己造一张证书,但这样别人访问你的网站的时候还是会遇到麻烦,因为你自己造的证书不在用户浏览器的信任范围之内,你还得在用户浏览器上安装你的证书,来让用户浏览器相信你的网站,很多用户并不知道如何操作,就算会操作,也能也不乐意干;另一种选择是你向权威证书颁发机构申请一张证书,但这样有一定的门槛,还需要付费,也不是我们乐意干的事。
所以使用JS来实现RSA加密是个很好的方法..我的网站是ASP。NET的..真正的难点在于用javascript实现一个和.net的RSA兼容的算法
加解密及传输流程
后台产生一对公钥私钥
传给WEB页面
登录/注册的时候,使用JS加密
后台解码.
后台产生一对公钥下发给WEB页
protected void Page_Load(object sender, EventArgse)
{
pwdEncodepe= new pwdEncode();
string[] ret=pe.PublicKey();
strPublicKeyExponent=ret[0];
strPublicKeyModulus=ret[1];
}
protected string strPublicKeyExponent="";
protected string strPublicKeyModulus="";
WEB页JS调用公钥进行加密提交
//两个加密文本框,加密后的密码保存在这里..如果是登录页面,只需要一个就可以了
<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();
});
后台校验密码不能为空
因为使用了加密方式,所以原来的校验需要去掉,使用新的校验方式
loginCheckorlc= 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
pwdEncodepe= 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); //检测两个密码是否相同
//不能直接检测参数,因为公钥加密后的两个参数不同,需要解密后进行比较
解密密码
-------登录后台
pwdEncodepe= new pwdEncode();
Pword=pe.getPwd(Request["encrypted_pwd"]);
密码编码器pwdEncode大部分原码
//这里主要使用session来保存RSA加密器和私钥
//发送公钥
public string[] sendPublicKey()
{
RSACryptoServiceProviderrsa;
if (HttpContext.Current.Session["rsa"]!= null)
rsa= (RSACryptoServiceProvider)HttpContext.Current.Session["rsa"];
else
rsa= new RSACryptoServiceProvider();
//if (string.Compare(Request.RequestType, "get", true) == 0)
{
//将?私?钥?存ä?Session中D
HttpContext.Current.Session["private_key"]=rsa.ToXmlString(true);
HttpContext.Current.Session["rsa"]=rsa;
}
//把ã?公?钥?适º¨º当Ì¡À转Áa换?,ê?准Á?备À?发¤¡é往ª¨´客¨ª户¡ì端?
pwdEncodepe= new pwdEncode();
RSAParametersparameter=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(stringpwd)
{
RSACryptoServiceProviderrsa;
rsa= (RSACryptoServiceProvider)HttpContext.Current.Session["rsa"];
pwdEncodepe= 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 -博客园
- paip.提升安全---网站登录密码明文传输的登录高危漏洞解决方案
- 网站安全之密码明文传输漏洞
- 解决DiscuzX3.3登录页面密码明文传输问题
- paip.提升安全性---登录密码出错次数检测
- 基于RSA的网站登录密码的加密传输
- 【Android安全】WebView密码明文保存漏洞
- 开发网站登录功能时,如何保证密码在网络传输过程中的安全?
- 登录注册系统,前端密码安全解决方案
- Android应用安全实践 -- 某些Android应用在客户端明文存储登录密码
- 网站的无密码登录
- QQ登录的加密传输安全
- 360网站安全检测平台4月所爆DEDECMS高危漏洞的修复方案
- 实现安全的免密码ssh登录
- paip.网站接入QQ登录总结
- paip.网站提示SESSION过期 登录过期 以及二次登录的问题
- WinXP登录密码丢失的解决方案
- 忘记 WinXP 登录密码的解决方案
- 忘记Windows XP登录密码的解决方案
- 传智播客-JavaString-day05
- 跟燕十八学习PHP-第5天-运算符之逻辑运算符-位运算符
- 传智播客-Java集合框架-day06
- KVM存储池\存储卷
- HTML5 拖拉的例子
- paip.提升安全---网站登录密码明文传输的登录高危漏洞解决方案
- 多服务器间共享Session的解决方案
- 在UITableView中画竖线
- 传智播客-JavaIO-day07
- java中serializable
- 输入内容(string类型的),统计字母/数字/空格的数量 [C#]
- 传智播客-JavaGUI-day08
- 爱 不说再见
- 使用闪联任意通将xp打造成wifi热点