说到在http协议下用户登录如何保证密码安全这个问题:
    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发到服务器。
    这样做是无法保证用户的账户安全的,因为稍微懂一点编程知识的人就可以通过你发送的http请求知道了你的密码,小白又说了,我密码加密了,它拿到的也是加密后的密码,它不知道我的原始密码它是无法从登录页面登录的。

原文和作者一起讨论:http://www.cnblogs.com/intsmaze/p/6009648.html

新浪微博:intsmaze刘洋洋哥


    但是小白啊,你有没有想过,有时候我仅仅知道你加密后的密文就够了,我可以自己伪造http请求,把密文加在请求参数里面,一样可以登录系统的。
    大白这时候有话说了,大白:我可以对密码进行加盐。好,我们先看加盐是什么,加盐简单说就是程序对用户设置的原始密码后面追加随机数来加强用户密码的复杂性,然后再对组合后的密码进行加密进行存储,用户每一次登录,前端先对用户输入密码进行加密传输到后端,然后后端获得用户账号到数据库找到该用户的盐,再和传来的明文组合一起进行一次加密后与数据库中的密码进行对比来判断是否是符合用户。但是啊,大白,你看,这样做,并无法控制其他人通过你http请求获得密文,获得后,人家照样大摇大摆使用你的身份登录系统进行操作。
    好,大白让我跟你讲讲加盐的真正意义:加盐的意义不是为了保证密码在网络传输的安全性,而是防止数据库被人入侵后,由于原始密码太过简单,被人分析出来,进而知道了密码。直接对密码进行MD5处理后,反向解密确实难度很大,但还是可以找出破绽的 例如:两个人或多个人的密码相同,通过md5加密后保存会得到相同的结果。破一个就可以破一片的密码。如果用户可以查看数据库,那么他可以观察到自己的密码和别人的密码加密后的结果都是一样,那么,别人用的和自己就是同一个密码,这样,就可以利用别人的身份登录了。那么我们以前的加密方法是否对这种行为失效了呢?其实只要稍微混淆一下就能防范住了,这在加密术语中称为“加盐”。具体来说就是在原有材料(用户自定义密码)中加入其它成分(一般是用户自有且不变的因素),以此来增加系统复杂度。当这种盐和用户密码相结合后,再通过摘要处理,就能得到隐蔽性更强的摘要值。
    小黑说:你说的这些我都懂,我来告诉你最终的方案吧:在用户输入完账号后,后台ajax发送用户的账号到服务器,这个时候服务器为该账号生成一个随机数验证码,响应给前端登录页面。
    当用户输入密码后,前端页面对用户输入的密码进行加密,然后把加密后的密文和获得服务器返回的验证码组合在一起再一次进行加密。然后把该信息发送到服务器,服务器session中保存这这个账号的验证码,服务器会从数据库获取该用户的密码和验证码进行组合再次加密与前端传来的明文进行对比判断。
好,接着让我们分析为什么安全,因为验证码是一次性的,, 所以,你在网络层拿到本次的请求之后,无法做重放攻击, 因为验证码是不正确的.而当你获取新的验证码, 但你并不知道 组合之前的内容[md5(md5(密码) + 用户的QQ号)] 是什么 , 所以你无法重新发送本次请求实现登陆的目的.32位MD5 + 4位验证码 总计 36位的字符串, 你去破解吧. 估计等你挂了你也破解不出来.至于服务端的校验, 只要将记录下来的MD5值(而不是记录的密文), 进行同样的运算, 得到的结果与提交上来的一样, 即密码正确.验证码的内容是服务器下发的,而且是一次性的,所以 客户端无法伪造, 也无法重用.
下面是QQ之前网页的源代码片段:
Q 网页上的登陆模块(全程HTTP/GET请求).
QQ 在登陆时,对用户输入的密码加密的JS代码为:

 function getEncryption(password, uin, vcode, isMd5) {
var str1 = hexchar2bin(isMd5 ? password : md5(password));
var str2 = md5(str1 + uin);
var str3 = md5(str2 + vcode.toUpperCase());
return str3
}

白话就是: md5(md5(md5(密码) + 用户的QQ号) + 验证码)
现在你知道如何在http协议下保证密码安全性了没有。

然后我们在说说用户登录后,我们是否要把用户的密码保存到session中。

以前同事写的密码修改部分代码,发现将用户登录的密码存在session中,然后判断原密码时直接从session中读取。

把密码存在session中安全吗?
session的保存方式相对来说比较安全,因为信息存储在服务器的 
而cookie的方式由于对服务器端来说是不可控的,始终对用户信息泄露是一个危险,但是也有很多采用cookie存储用户信息的,通常是采用加密的方式来进行处理。
我们经常看到很多网站设置记住用户名密码,就是采用cookie的方式

可行性上,我不建议这么做。就连sun公司在是设置password的时候,都用transient 来管理, private transient String password;都不希望password序列化掉, 所以我们跟不能为了方便而把密码存入session中来为了方便。 

最后我们谈谈加密的本质:它其实是对原有内容的混淆,目的是提高从表面结果反推达到目的的成本。
在网页提交(其实所有的通信都有这个问题)密码这个问题上,需要有几个维度来保证安全,
 
首先是切面的安全性,对于一次提交首先保护的是密码本身,从最早的Base64到MD5或是SHA都可以做到这一点,但是Base64是可逆的,对于密码本身的保护是很弱的,哈希算法解决了这个问题,将不同长度的数据转换成统一长度的大数字,而理论上这个数字对应无穷多解,但限于密码的输入有限制,其实是可逆的,所以从1次混淆的MD5变成了3次混淆的SHA,但是随着现代计算机技术的进步,逆运算的成本不断降低,人们不得已要使用更大的数字来提高这个难度,但是为了向成本和发展妥协,人们不得已使用统一的算法,在CS时代由于很难侵入到CS两端,所以相对的双方使用的算法是保密的,破解难度相对比较大,BS由于为了保证开放性,特别是js本身就是明文算法,所以其实只能说防君子不妨小人,所以就有了安全控件,控件的唯一目的是用2进制代码来隐藏加密的算法,不知道算法,也就很难破解密文。

第二维度就是时间,如果密码一样加密结果也会一样,那么在不使用明文的情况下,可以使用加密过后的数据来模拟用户登录的动作也是可以的,所以纯粹对密码的加密其实不能解决这个问题,所以有了盐值,让同一个数据在不同情况下结果依旧不一致,但是盐值需要约定,总会被人找出规律,只是成本又高了点,所以还是不安全,这就引发了通讯安全的问题。所以出现了https使用非对称加密来保护数据通路上的安全,让通讯变得不可窥视。但是还有个东西叫木马,所以人们在输入上继续做文章,包括混淆输入,就是软键盘,好的控件不会把明文存在内存里,这很重要,以前的VB、Dephi密码控件都仅仅看不到,实际内存里面都是明文,很容易被病毒和木马利用,所以一般来说现在最安全的bs系统使用控件保护输入,隐藏自己的HASH算法,用HTTPS保护通讯。

更多关于加盐的介绍可以参考这篇文章:http://blog.jobbole.com/61872/

 

HTTP协议下保证密码不被获取更健壮方式的更多相关文章

  1. HTTP协议下保证登录密码不被获取更健壮方式

    说到在http协议下用户登录如何保证密码安全这个问题:    小白可能第一想法就是,用户在登录页面输入密码进行登录时,前台页面对用户输入的密码进行加密,然后把加密后的密码作为http请求参数通过网络发 ...

  2. HTTP协议下保证登录密码不被获取最健壮方式

    原文:http://www.cnblogs.com/intsmaze/p/6009648.html HTTP协议下保证登录密码不被获取最健壮方式   说到在http协议下用户登录如何保证密码安全这个问 ...

  3. TCP协议下大数据传输IOCP乱序问题

    毕业后稀里糊涂的闭门造车了两年,自己的独立博客也写了两年,各种乱七八糟,最近准备把自己博客废了,现在来看了下这两年写的对我来说略微有点意义的文章只此一篇,转载过来以作留念. 写的很肤浅且凌乱,请见谅. ...

  4. tcp协议下的Socket

    import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net ...

  5. kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 【转】

    转自:http://blog.chinaunix.net/uid-26349264-id-4455634.html 目录 kali Linux下wifi密码安全测试(1)虚拟机下usb无线网卡的挂载 ...

  6. HTTP协议下可拖动时间轴播放FLV的实现(伪流媒体)

    HTTP协议下实现FLV的播放其实并不复杂,当初实现的原理是使用了flowPlayer插件实现的,效果还不错.但仍有两大问题影响着客户的访问情绪: 1.预加载时页面卡死,似乎没有边下边播. 2.偶尔边 ...

  7. TCP协议如何保证可靠传输

    TCP协议如何保证可靠传输 概述: TCP协议保证数据传输可靠性的方式主要有: (校 序 重 流 拥) 校验和: 发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化.如果收到段的检 ...

  8. TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q

    TCP协议下的服务端并发,GIL全局解释器锁,死锁,信号量,event事件,线程q 一.TCP协议下的服务端并发 ''' 将不同的功能尽量拆分成不同的函数,拆分出来的功能可以被多个地方使用 TCP服务 ...

  9. C#实现http协议下的多线程文件传输

    用C#实现HTTP协议下的多线程文件传输转自  http://developer.51cto.com/art/201105/263066_all.htm C#(C Sharp)是微软(Microsof ...

随机推荐

  1. JS鼠标事件大全 推荐收藏

    一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...

  2. Android Butterknife 8.4.0 使用方法总结

    转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6016341.html 本文出自[赵彦军的博客] 前言 ButterKnife 简介 ButterKnife是 ...

  3. git提交项目到已存在的远程分支

    今天想提交项目到github的远程分支上,那个远程分支是之前就创建好的,而我的本地关联分支还没创建.   之前从未用github提交到远程分支过,弄了半个钟,看了几篇博文,终于折腾出来.现在把步骤整理 ...

  4. 多本地代码工作点更新到2个远端GIT仓库

    摘要:本文介绍了笔者多个本地工作节点(地方)的多台电脑(PC/笔记本电脑)同步源码到2个远端的GIT(一个GITHUB国外强制公开,一个oschina国内可不公开). 作者:太初 转载说明:请指明原作 ...

  5. Linux 利用Google Authenticator实现ssh登录双因素认证

    1.介绍 双因素认证:双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起才能发挥作用的身份认证系统.双因素认证是一种采用时间同步技术的系统,采用了基于时间.事件和密钥三变量而产生的一 ...

  6. TCP/IP之TCP_NODELAY与TCP_CORK

    TCP/IP之Nagle算法与40ms延迟提到了Nagle 算法.这样虽然提高了网络吞吐量,但是实时性却降低了,在一些交互性很强的应用程序来说是不允许的,使用TCP_NODELAY选项可以禁止Nagl ...

  7. 性能测试工具 wrk 安装与使用

    介绍 今天给大家介绍一款开源的性能测试工具 wrk,简单易用,没有Load Runner那么复杂,他和 apache benchmark(ab)同属于性能测试工具,但是比 ab 功能更加强大,并且可以 ...

  8. Java版本:识别Json字符串并分隔成Map集合

    前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...

  9. .Net中的AOP系列之《间接调用——拦截方法》

    返回<.Net中的AOP>系列学习总目录 本篇目录 方法拦截 PostSharp方法拦截 Castle DynamicProxy方法拦截 现实案例--数据事务 现实案例--线程 .Net线 ...

  10. 页面与ViewModel(下)

    在上一篇博客中,笔者分享了一些从页面整体的角度对页面与ViewModel的思考.在本文中笔者希望从相对细节的角度分享一些对页面与ViewModel的思考. 比如,当我们在更新View Model中的绑 ...