更新时间:2024-06-01 18:54
目的:
使数据安全保密传输,例如防止明文数据传输时,被黑客截获,所带来的安全隐患。
适应领域:
适合各种网络协议数据传输加密(如身份认证,交易接口,数据加密等)各种网络协议(如http, ftp, smtp等)。尤其适合使用在互联网用户登录认证,交易接口。
现阶段常用的方案:
优点:
实现简洁,基于当前传输协议,数据安全传输。不增加任何端口,所以也不要修改当前的防火墙规则。
缺点:
增加网络传输量,系统客户端和服务端的开销,但很幸运的是开销很小,也是任何一种安全措施不可避免的问题。
1. 客户端请求动态密钥(DynamicKey),客户端向服务器端请求动态密钥(DKey)。服务器端生成动态密钥发送给客户端。动态密钥内容格式根据需要自己设计,例如双方支持的加密算法(MD5)、随机码和密钥有效期等,并且在服务器保存该动态密钥,保持形式可以是Session(推荐)、数据库或文件等,例如动态密钥格式为(MD5 + 123456 + 2010/9/23/12:00:00),最简单的形式只有一个随机码。
2. 客户端提交数据, 客户端获得动态密钥后,用动态密钥中的加密算法加密需要发送到服务器的数据(如:账号和密码)和随机码,客户端把加密好的数据发送给服务器:
3. 服务器验证应答, 服务器把收到的加密好的客户端数据,和服务器端用动态密钥中的加密算法对服务器端数据(如保证在数据库的密码)和随机码进行加密,生成加密好的服务器端数据(Server encrypted data)进行比较,相等则认证成功, 服务器删除动态密钥(DKey)。一个完整的数据安全传输结束。
例如WEB用户登录认证步骤:客户端浏览器用ajax向服务器端WEB Server发生请求动态密钥(DKey), WEB Server 生成DKey(随机码)发送给客户端,客户端用特殊的加密方法加密输入的用户名和随机码得到加密信息Client_enc_name,用MD5加密输入的用户密码和随机码得到加密信息Client_enc_pwd,然后提交给服务器验证。 服务器用特殊的解密方法解密出用户名input_name与数据库中的用户名db_name比较;用MD5加密数码数据库中的用户密码db_password得到加密信息Server_enc_pwd 与客户端提交的得到加密信息Client_enc_pwd比较,比较相等则登录成功,同时删除动态密钥(DKey)。
注:这里用户名也可以不加密直接明文传输,但最好在客户端用特殊的加密方法加密,在服务器端用特殊的解密方法解密; 而用户密码一定要加密而且最好用MD5之类不可逆转加密方法。
伪代码:
Client: Request Dynamic_key
Server: Reply and Save Dynamic_key (random_num)
Client:
Client_enc_name = myencode (input_name + random_num)
Client_enc_pwd = md5 (input_password + random_num)
Server:
Input_name = mydecode (Client_enc_name + random_num)
Server_enc_pwd = md5 (db_password + random_num)
If (Input_name == db_name and Client_enc_pwd== Server_enc_pwd)
Returntrue
Else
Returnfalse
EndIf
Delete Dynamic_key
注: 每种方法都有各自的优缺点,有兴趣可以参考其他方式,例如Kerberos, X.509. 本人从事多年WEB开发、Unix/Linux系统开发及用户身份认证,希望能和大家交流探讨。