一个关于web环境里身份验证的模型.
基于交换密钥的设计.
基于一个假设,即password是client和server才知道的.
于是,在初始的时候,client生成一个随机变量,经过单向哈希之后成为一个定长字符my_key_client.在web环境,这个产生过程在本地进行.也就是说,除非能监听到本地动作,那么my_key_client对于client之外的所有人都是不可知的.
而如果能够被监听到,那么,也无所谓安全性,因为username和password也是可被监听的,也就不需要继续将安全性谈下去了.
将password单向散列为另一个定长字符串friend_key.而此friend_key,理论上只有client和server才知道.(password只有client和server才知道)
于是,将my_key_client以friend_key作为密钥做一个对称加密,同时,将一些需要加密的信息用my_key_client加密,传送到server,server就能够逆运算出my_key_client,进而逆运算出加密内容.从而使得client的发送是只有client和server才能解密的.
有个问题,如何保证server逆运算出来的my_key_client是正确的呢?
对于对称加密算法,不同密钥可能解除不同的内容,而在以上的条件下,无法判定解出的内容即是原始的内容.
即,如何判定解出的my_key_client是原本的my_key_client.
于是,我们需要一个checksum.
checksum一个由交换内容friend_key和my_key_client拼接后,利用单向哈希生成的一个定长摘要.
这样,理论上,这个摘要依赖于my_key_client(freind_key是对方已知的),所以,某种程度上,它也是唯一的.只要解出的my_key_client和接收到的exchange_key再做一次这样的摘要运算,如果两者符合,那么可以认为my_key_client是原始的my_key_client.(无数学证明)
这样,对于client来说,可以安全地与进行身份验证.
在验证完毕之后,server是拿到了my_key_client.
也就是说,此时server拿到了除了client和server之外,无人能知的key,所以,类似client,server也可以在本地生成一个随机密钥my_key_server,同时将my_key_client作为server端的friend_key,进行如上的操作,也能达到安全的通讯.
于是,client和server可以在每一次完整的会话之后,都改变密钥,且保证了会话的次序.
因为,即便某一次,会话被劫持了,被第三方伪造了一个假的加密内容,但是,由于第三方无法找到加密用的my_key,所以,伪造的内容无法在如何一方通过checksum的认证(因为checksum必然是不匹配的),那么,除了能够保证会话的安全性之外,一旦会话被劫持,整个会话也就失效(因为任何一方都不能再正确解密内容,前面说了,正确与否在于checksum是否匹配,而checksum必然是不匹配的).
所以,基于这个模型的会话,应该是比较安全的.
至少,不会被劫持,或者在传输过程中被偷窃如何东西.
伪代码流程如下:
client:
my_key = digest(random());
friend_key = digest(password);
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);
server:
receive( exchange_key , checksum );
friend_key = digest(password);
my_key_client = xor( exchange_key , friend_key );
if( digest(my_key_client + friend_key ) == checksum )
pass secure check;
my_key = digest(random());
friend_key = my_key_client;
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);
else
deny acess
end-if;
client:
receive( exchange_key , checksum );
friend_key = load_loacl();
my_key_server = xor( my_key , exchange_key );
if( digest(my_key_server + friend_key ) == checksum )
pass secure check;
my_key = digest(random());
friend_key = my_key_server;
exchange_key = xor( my_key , friend_key );
checksum = digest(my_key + friend_key);
save_local( my_key );
send( exchange_key , checksum);
else
session was broken;
end-if;
server
...
2009-10-09
一个基于交换密钥的安全会话模型
订阅:
博文评论 (Atom)
在疯狂动物城之后
去看了疯狂动物城2. 动机算是为了碟醋吃了盘饺子. 在时间线上看到有人发了个彩蛋的图. 一个胡萝卜核弹状的录音笔,加上小不点的中翻称呼,结合最近的中日关系,不免有迷之微笑. 想着,这私货塞的有点手眼通天. 虽然最终看下来多少有点自娱自乐. 但也不妨碍这确实是夹带私货的续作. 社交...
-
下午查了下关于仿制药的一点东西. 首先是关于一致性定义的相关文件. 简单的Google一般会指向NMPA/国家药监局的一些关于 化学药品注射剂仿制药质量和疗效一致性评价技术要求 的相关政策公告或者是更早期一些的关于这个文件起草意见稿. 一般理解的西药就是指化学药品. 这个文件本...
-
看完了一部未完成的电影. 这部片片子比较有意思的是一开始那段自嘲. 秦昊关于既然拍了也播不了,只是私下小圈子里自嗨的事情又什么意义的质问. 片里导演也 讪讪地承认生活的现实. 到这里其实沿着原有的思路,把补拍和一些意外穿插进去,可能还是一个不错的文艺片. 至少于戏里戏外的导演来说...
-
看 金枝 ,读到关于求雨的各种巫术习惯的时候忽然发觉,这其实跟当时的社会需求有关吧. 农业为主,自然是靠天吃饭,尤其在无法弄清下雨原因的时候. 这种"崇拜"虽然说是出于"无知",但究其本质还是因为对于天气有着不可替代的需求. 有所求的...
没有评论:
发表评论