用多步的密匙交换方式来进行非常安全的会话初始化和用户名密码登陆

原创 2003年01月20日 09:49:00

用多步的密匙交换

一般的验证是需要传递用户名和密码的。
但是怎样才能保证传递的过程中密码不被泄露??
可能会有人说,对密码进行加密不就完了?
但是实际上,除了密码不被泄露外,还需要保证没有截取欺骗等安全问题。

RSA等非对称加密,可以另第三方无法得到客户的密码。
但是第三方则可以直接发送加密过的数据,达到欺骗服务器的目的。

下面是我设计的一个解决方案,(绝对原创,但是原理简单,不保证有人之前已经用这个了。)

现在用三重DES:

第一步:
客户端,用户输入
clientUsername,clientPassword
客户端,往服务器端发送clientUsername

第二步:
服务器,接收到clientUsername后,
查找databaseUsername
如果没有找到 -> Exception -> 设计一个方案告诉客户找不到用户名,终止

第三步:
服务器,得到databasePassword,
生成一个字符串serverStr1,serverStr2,并且储存起来
(其实放在session中还是其他地方,随便,但是不要放到客户端去,例如不要使用ViewState)

用databasePassword作为Key,对serverStr1进行加密,
得到serverStr1Encrypted=TDES(serverStr1,databasePassword)

用serverStr1作为Key,对serverStr2进行加密,
得到serverStr2Encrypted=TDES(serverStr2,serverStr1)

把serverStr1Encrypted,serverStr2Encrypted传到客户端

第四步:
客户端,得到serverStr1Encrypted,serverStr2Encrypted
用clientPassword作为Key,对serverStr1Encrypted进行解密,
得到clientStr1=~TDES(serverStr1Encrypted,clientPassword)
用clientStr1作为Key,对serverStr2Encrypted进行截密,
得到clientStr2=~TDES(serverStr1Encrypted,clientPassword)
如果其中一次解迷发生错误,-> Exception -> 那么告诉客户密码不对,终止

如果密码是对应的话,那么serverStr1和clientStr1是对应的。serverStr2和clientStr2对应。
这个过程目的就是使用password作为Key,然后在两者间安全地交换密匙str2

使用clientStr2作为Key,对clientPassword进行加密,
得到clientPasswordEncrypted=TDES(clientPassword,clientStr2)

第五步:
把clientPasswordEncrypted送到服务器端

第六步:
服务器,得到clientPasswordEncrypted
根据会话状态,
测试:
clientPasswordEncrypted==TDES(databasePassword,serverStr2);
如果其中一次解迷发生错误,-> Exception -> 那么告诉客户密码不对,终止

如果相等?LoginAs(databaseUsername);


这个方法也不是100%安全。首先是DES本身的问题。这个则不作为讨论范围。
然后最突出的问题在第五步。

如果在clientPasswordEncrypted发送过程中,被第三方终止了,
然后第三方冒认客户,把clientPasswordEncrypted传过去,就可以达到欺骗的目的。

为了防止这个,需要在第六步,需要在会话方面进行进可能多的会话验证。
例如判断IP等方法。(物理因素往往比数字因数好)

然后更多的方法是进行密匙交换,(当中的DESKey当然是随机的,只对会话其效果的)
第三步,
服务器另外创建serverDESKey,作为让客户进行信息加密之用
传给客户的则是serverDESKeyEncrypted=TDES(serverDESKey,serverStr1)
第四步,
客户端另外创建clientDESKey,作为让服务器进行信息加密之用
clientDESKeyEncrypted=TDES(clientDESKey,clientStr1)
然后在第五步和clientPasswordEncrypted同时交给服务器。

那么即使发生欺骗,
第三方没有办法得到两个DESKey,
没有办法发送合法的请求,也没有办法把得到信息进行解密。

这个过程。核心仍然是会话初始密匙clientStr1=serverStr1


 

spring web项目 数据库用户名密码加密解密

spring web项目 数据库用户名密码加密解密 在使用springMVC开发web项目中,数据库的用户名,密码一般都是配置在.properties文件中 然后在通过.xml配置文件引入...
  • yucaifu1989
  • yucaifu1989
  • 2016年03月17日 14:16
  • 2266

mysql的加密总结

如果数据库保存了敏感的数据,如银行卡密码,客户信息等,你可能想将这些数据以加密的形式保存在数据库中。这样即使有人进入了你的数据库,并看到了这些数据,也很难获得其中的真实信息。   在应用程序的大量信息...
  • hongsejiaozhu
  • hongsejiaozhu
  • 2007年11月09日 15:32
  • 7814

网站一打开就显示windows安全,输入用户名和密码

我在配置服务器的时候(IIS+php)网站出现弹出窗口,
  • ximenxiafeng
  • ximenxiafeng
  • 2014年04月14日 00:50
  • 5781

Java Web开发如何在注册和登录时对用户名和密码进行验证?

1 注册时,对注册的手机号和密码验证: 手机号码为常用的移动,联通,电信号 密码为数字和字母的组合,切长度不能少于8位 方案 在提交注册信息时,用Ajax提交手机号和密码到Servlet进行验证 代码...
  • qq_31462011
  • qq_31462011
  • 2017年05月06日 15:52
  • 3122

Spring中管理数据源,加密和解密账号密码的方法

开始有一篇关于SSH框架上加密t
  • dsiori
  • dsiori
  • 2017年01月05日 14:47
  • 2349

Python Show-Me-the-Code 第 0021题 密码加密

第 0021 题: 通常,登陆某个网站或者 APP,需要使用用户名和密码。密码是如何加密后存储起来的呢?请使用 Python 对密码加密。 阅读资料 用户密码的存储与 Python 示例 阅读资料 H...
  • huangxiongbiao
  • huangxiongbiao
  • 2015年06月02日 00:08
  • 1369

将数据库中的用户名和密码显示到JSP页面

JavaWeb三层架构: 结构: 1.建立实体User 2.DAO,把查询到的数据结果封装到User中 3.service,依赖于DAO,将结果发送给Servlet 4....
  • fandoudou123
  • fandoudou123
  • 2016年01月08日 12:51
  • 1642

GeoServer的默认用户名和密码

总是容易忘记,干脆写在这里。 用户名:admin密码:   geoserver
  • jubincn
  • jubincn
  • 2011年01月27日 22:09
  • 6402

对web项目数据库user pwd实行加密

对web项目数据库user pwd实行加密思路:1.写properties配置文件,导入el变量 2.加密properties文件user,pwd 3....
  • secens7
  • secens7
  • 2017年01月06日 10:07
  • 369

存储密码——要做对

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 10:36
  • 90
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用多步的密匙交换方式来进行非常安全的会话初始化和用户名密码登陆
举报原因:
原因补充:

(最多只允许输入30个字)