一个关于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)
一部未完成的适配
看完了一部未完成的电影. 这部片片子比较有意思的是一开始那段自嘲. 秦昊关于既然拍了也播不了,只是私下小圈子里自嗨的事情又什么意义的质问. 片里导演也 讪讪地承认生活的现实. 到这里其实沿着原有的思路,把补拍和一些意外穿插进去,可能还是一个不错的文艺片. 至少于戏里戏外的导演来说...
-
最近在改一个SparkSQL AST解析相关的问题. 主要做一些权限管控校验重写的事情. 之前做过一版重写,现在反馈了几个问题. 一个是类似delete from table where子句的错漏. 一个是select from where not exists in (subq...
-
中午和人聊一些马克思和生产力的问题. 然后提到了生产力发展的另一种说法是生产力过剩. 某种程度上来说,基于允许一部分搭便车的社会主义生产力理论确实形式上要求着一定程度的产能过剩. 因为只有这样才能够使得搭便车的成本,或者会所才能忽略掉这部分成本,形式上让生产能够继续下去. 只有从...
-
最近算跟风玩了下黑神话. 用的Geforce Now加月卡. 勉强到第二回打完沙国父子,回头准备去打地狼吧,然后20小时优先卡就被踢出去了. 难度对于个人这种没接触过的玩家来说还是挺大的. 一个Boss花个三四个小时很常见,或者说必然吧. 像第一个头目幽魂就卡了挺久. 后来学会拆...
没有评论:
发表评论