起因:
最近网上在加大检查力度,全国各省客户陆陆续续有报网络安全隐患
例子:
经技术检测发现,*****网站存在密码重置逻辑漏洞的通报, 发现该系统4位短信验证码,可以直接爆破,重置管理员密码。漏洞定位:*****页面。处置建议:*****
加密:
加密(encryption)是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容。加密可以用于保证安全性,但是其它一些技术在保障通信安全方面仍然是必须的,尤其是关于数据完整性和信息验证。加密在网络上的作用就是防止有用或私有化信息在网络上被拦截和窃取。
适用范围:
- 密码
- 验证码
- 登陆名
加密位置:
- js
- 后台
- 数据存储
此处只描述我比较用惯的方法,方法肯定不止这些的
一、javascript加密
大概是需要两层,一层是没有注册为服务器控件的input,用来存明文,也就是页面上看见的;一层是服务器控件,用来传加密后的密文到服务器;这个加密的过程呢是需要在前端javascript使用到加密方法的(包括①对称加密算法3DES、AES等,②MD5、SHA1等单向HASH算法,③特殊的单向HASH算法,④PBKDF2算法,⑥bcrypt、scrypt等算法等等,这里呢重点在js的处理,就不展开写加密的算法了)。
一般我用得简单的就是base64:
<script type="text/javascript">
function test() {
document.getElementById('password').value = base64encode(document.getElementById('input').value);
}
function base64decode(str) {
var c1, c2, c3, c4;
var i, len, out;
len = str.length;
i = 0;
out = "";
while (i < len) {
/* c1 */
do {
c1 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c1 == -1);
if (c1 == -1)
break;
/* c2 */
do {
c2 = base64DecodeChars[str.charCodeAt(i++) & 0xff];
}
while (i < len && c2 == -1);
if (c2 == -1)
break;
out += String.fromCharCode((c1 << 2) | ((c2 & 0x30) >> 4));
/* c3 */
do {
c3 = str.charCodeAt(i++) & 0xff;
if (c3 == 61)
return out;
c3 = base64DecodeChars[c3];
}
while (i < len && c3 == -1);
if (c3 == -1)
break;
out += String.fromCharCode(((c2 & 0XF) << 4) | ((c3 & 0x3C) >> 2));
/* c4 */
do {
c4 = str.charCodeAt(i++) & 0xff;
if (c4 == 61)
return out;
c4 = base64DecodeChars[c4];
}
while (i < len && c4 == -1);
if (c4 == -1)
break;
out += String.fromCharCode(((c3 & 0x03) << 6) | c4);
}
return out;
}
</script>
给input
添加onkeyup="test()"
,键盘每松开一下就会给password
赋加密后的值,效率会有点影响的,还要给每个控件加上位数限制MaxLength="50"
二、后台解密
这里呢其实就比较简单了,写个自己用的解密的函数即可,我这里就贴一个通用的base64解密意思意思
// base64编码
byte[] b = System.Text.Encoding.UTF8.GetBytes(jsons);
string base64jsons = Convert.ToBase64String(b);
base64jsons = base64jsons.Replace("+", "%2B");
// 解码
byte[] temp = model != null ? Convert.FromBase64String(model) : new byte[0];
string jsonRes = System.Text.Encoding.UTF8.GetString(temp);
三、 数据存储
切记切记,后台的数据存储的时候也一定要加密,方法什么的就自己选择,最后在数据库存的一定不可以是“123456”这样子的,密码,验证码,登陆名这些都一定要加密存储,管理和保存好自己的密钥。
需要注意的点:
使用javascript改变服务器控件的值是触发不了asp:TextBox的TextChanged事件的。
如果需要进行密码强度的限制的话要用到正则表达式在后台进行判断的。
<script type="text/javascript">
(function(window){
function $(id){
return document.getElementById(id);
};
var arr = ["","低","中","高"];
// 获取对象
var ipt = $("ipt"),strength = $("strength"),strLength = $("strength_length");
// 密码输入事件
ipt.onkeyup = function(){
var s = 0;
var txt = this.value;
if( /[a-zA-Z]/.test(txt) ){
s++;
};
if( /[0-9]/.test(txt) ){
s++;
};
if( /[^0-9a-zA-Z]/.test(txt) ){
s++;
};
if( txt.length <6 ){
s = 0;
};
strength.innerHTML = arr[s];
strLength.className = "lv" + s;
}
})(window)
</script>
单纯的加密其实是会被各种各样的方法破解的,实际情况下还需要例如登陆或者修改密码的时候加入短信验证码/图片验证码,这部分自己写也可以,直接调用例如阿里云之类的接口也可以,验证码需要加入使用次数和时间限制,登陆尝试也要进行限制,超过多少次就锁定账号之类的。
<script type="text/javascript">
function DisableButton() {
$("#cmd").attr("disabled", "");
clearInterval(timer);
}
var i = 90;
var timer = null;
function timers() {
$(function () {
if (i >= 0) {
$("#cmd").val("获取验证码" + i).attr("disabled", "disalbed");
i--;
}
else {
$("#cmd").val("获取验证码").removeAttr("disabled");
clearInterval(timer);
}
});
}
function startTimer(){
timer = setInterval("timers()", 1000);
}
</script>
网友评论