Windows Live ID internals
Windows Live ID(WLID)本身是一个identity provider,他负责维护用户的用户名,密码。 作为一个想使用WLID的网站,需要首先注册成为Windows Live application。注册的时候,你先需要有一个WLID! 注册的目标是双方需要有一个PSK——preshared key(WLID叫Secret Key)。这个key是用来验证WLID传回来的token的。注册的同时要求给WLID提供一个Return URL,当用户登录成功,或者logout的时候,WLID会调用这个页面,并且加上一些parameter,其中一个重要的就是stoken,这个参数含有一个WLID传回来的用户相关信息。 我也注册了一个, return URL=http://sma01:8080/wlid/return.jsp secret key=thisisaverylongkey Application ID=<span>00163FFF8000412B</span> WLID认证成功之后,他就redirect用户到Return URL,相当于SAML的ACS service。另外还要加上token之类的参数。 WLID给用户浏览器返回一个post form,内容如下 <html> <head> <noscript> JavaScript required to sign in <meta http-equiv="Refresh" content="0; URL=https://login.live.com/jsDisabled.srf?lc=1033″/> </noscript> <title>Continue</title> <script type="text/javascript"> function OnBack(){} function DoSubmit(){var subt=false;if(!subt){subt=true;document.fmHF.submit();}} </script> </head> <body onload="javascript:DoSubmit();"> <form name="fmHF" id="fmHF" action="<a href="http://sma01:8080/webauth/sample/webauth-handler.jsp">http://sma01:8080/webauth/sample/webauth-handler.jsp</a>" method="post" target="_top"> <input type="hidden" name="stoken" id="stoken" value="DvJ%2BtIPK9bn%2FKlG7PjSB7FNPFEzlX5g9HtHcBGGv2r2h5s1VsnzoRlI7GnSRNK%2Bo3pn87YJCJnTi1jtKgXEh3TLxASGCSt3Okju7MK51VDXz4KGSemv%2BARYN4WJ33FIoHoZ3aVvF19wsNq2YRnM8npmfgVh5ZDVtu%2FXA9FaUqKLRAsOR377dMpDXEWSOrsRQBsmRUy7dZPdZSW4F9%2F%2Fyow%3D%3D"> <input type="hidden" name="action" id="action" value="login"> </form> </body> </html> 再看看那个token的具体内容。token首先是base64编码的byte array。前16个字节是IV,剩下来的是加密的内容。加密是用的AES,准确的说,AES/CBC/PKCS5Padding。解密之后的东西居然可以直接得到一个string,看来是iso-8859-1字符集的。顺便说一下,那个decryption key是PSK加上一个前缀"ENCRYPTION",然后做SHA-256,获得的。没有使用PBE的PBRDF2算法,呵呵,让我平衡的很多。我自己做的也只是用SHA-1 hash两次,不过SHA-256可以一次获得16byte的key,的确很省事。 ...