<?xml version="1.0" ?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
<title>Bluemask Blog</title>
<link>http://bluemask.net/</link>
<description>来自bluemask.net的最新blog发布</description>
<pubDate>2009-02-14 01:05:48</pubDate>
<language>zh-CN</language>
<copyright>Copyright 2011 bluemask.net.</copyright>
<item>
<title><![CDATA[卡片密码的设计]]></title>
<dc:creator>blog.xlphoto</dc:creator>
<description><![CDATA[<p>华盛顿的街道命名很有意思，东西向全用字母命名，南北则全是数字命名。但是，在东西向的街道中，却没有字母J。传言称J表示当时的大法官某某，因为规划城市的人不喜欢这个人，所以给街道命名时跳过了字母J。但是实际情况是，当时的城市规划者认为字母I和J印在路牌上容易被路人混淆，按字母本身的顺序采用了排在前面的I，而放弃了J。</p><p>新联一直发行一种储值卡，顾客可以购买然后在网站充值，然后购买网站的商品或服务。这种储值卡最初由谁设计已经几乎不可考（大约5年前？），但是由于其设计的缺陷，导致这几年里我们以及我们的顾客直到不久前才停止忍受麻烦。</p><p>每张储值卡都有一个唯一的卡号和一个密码，卡号由两位字母和至少5位数字组成，密码则没有规律，通常同时包含大小写的字母和数字。就是这个简单的密码设计，造成了一直以来的麻烦。最初印刷的卡片，由于字体的原因，很多字母无法区分，例如字母O和数字0，小写字母g和数字9，字母z和数字2，字母i，j，小写的字母l(L)，数字1，等等。后来即使更换了卡片密码的印刷字体，依然还有许多许多无法辨别或误认的情况。这些年我们无数次接到顾客的电话寻求帮助，以及抓狂的抱怨。</p><p>一个草率的设计是多么可怕。&nbsp;</p>]]></description>
<link><![CDATA[http://bluemask.net/p/1113/]]></link>
<pubDate>2009-02-14 01:05:48</pubDate>
</item>
<item>
<title><![CDATA[SSL:HttpWebRequest的使用以及客户端验证]]></title>
<dc:creator>blog.xlphoto</dc:creator>
<description><![CDATA[
<p>一般的应用SSL的场合，并不需要客户端提供证书。但一些应用需要双向的SSL验证，服务器需要验证客户端是授权的客户端，客户端需要确认服务器是指定的服务器。</p>

<p>这个代码片断即为该过程的实现。&nbsp;</p>

<pre class="brush:js">ServicePointManager.ServerCertificateValidationCallback =
    new RemoteCertificateValidationCallback(
        CheckRemoteCert /* 在这个方法内检查服务器证书是否有效 */
    );
HttpWebRequest request = 
    HttpWebRequest.Create(HostURL) as HttpWebRequest;
request.KeepAlive = true;
X509Certificate crt = LoadCert(); /* 载入客户端证书 */
request.ClientCertificates.Add(crt);
request.Method = &quot;post&quot;;
request.ContentType = &quot;application/x-www-form-urlencoded&quot;;
byte[] requestData = Encoding.Default.GetBytes(GetRequestBody());
request.ContentLength = requestData.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(requestData, 0, requestData.Length);
requestStream.Close();
WebResponse response = request.GetResponse();
Stream responseStream = response.GetResponseStream();
byte[] alldata = ReadAllResponseData(responseStream);</pre>
<p>这个代码在管理员权限和一些比较高级的权限下运行良好，但是在NetworkService权限下会出现很奇怪的错误（即使证书是从文件读取，并且运行帐户有对该文件的访问权限）。</p>
]]></description>
<link><![CDATA[http://bluemask.net/p/1112/]]></link>
<pubDate>2009-02-13 23:41:08</pubDate>
</item>
</channel>
</rss>