C/S模型安全登录解决方案

来源:互联网 发布:vscode错误提示 编辑:程序博客网 时间:2024/05/01 08:12

身为信息安全专业的,还是写点与专业相关的博文吧。。嗯。

一般在C/S软件中,登录流程都设计的很复杂,比如QQ。一方面为了防止伪造客户端,而另一方面更重要的则是对信息加密,防止明文被截取。

下面介绍一种比较好的解决方案。

首先,加密算法首当其中选RSA了(因为每门专业课都要考它。。),先简单介绍下RSA原理:

RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解两个大素数的积。

密钥对的产生。选择两个大素数,p 和q 。计算:

n = p * q

然后随机选择加密密钥e,要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满足

e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )

其中n和d也要互质。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知道。

加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:

ci = mi^e ( mod n ) ( a )

解密时作如下计算:

mi = ci^d ( mod n ) ( b )

RSA 可用于数字签名,方案是用 ( a ) 式签名, ( b )式验证。具体操作时考虑到安全性和 m信息量较大等因素,一般是先作 HASH 运算。

OK,我们接下来的讨论假设公钥e,n已知,私钥d也已知。

然后直接用它们对客户端输入的密码加密就行了吗?显然不行,那样攻击者截获密文后不用解密,直接发给服务器照样可以验证通过。

在认证过程中加入随机数认证是比较普遍的解决方案,接下来我把详细过程写一下,参考的是marauroa,一个开源网游服务器代码。

1,客户端发送LoginRequestKeyMessage,告诉服务器自己准备登陆,并期望得到公钥。

2,服务器收到LoginRequestKeyMessage后,发送公钥key给客户端。

3,客户端保存公钥key后随机生成一个大整数,并将hash后的值clientNonce发给服务端。

4,服务端收到clientNonce,并随机生成一个大整数,然后照样将它hash后的值serverNonce发给客户端。

5,客户端收到serverNonce,此时此刻,客户端和服务端都有了一致的【clientNonce,serverNonce】且这对值每次登陆都不一样,因为都是由随机大整数hash而来。

好了,一切准备就绪,接下来就是客户端对输入密码的加密发送了,首先XOR(clientNonce,serverNonce),异或后的值存入b1。

然后XOR(b1,hash(password)),异或后的值存入b2。

然后用公钥加密b2,得到cryptedPassword后发送给服务器。

6,服务器收到cryptedPassword,嗯,【clientNonce,serverNonce】知道,私钥知道,怎么得到hash(password)应该很简单了吧,然后就是查询数据库验证,OK。

嗯,over了,仔细看看,要想破解,几乎是不可能的事情。

PS:最近应付考试,随便写点,俺密码学完全是菜鸟,仅供参考。。:)