C#でWSSE認証する

参照:はてなフォトライフAtomAPIとは - はてなキーワード

サービスによってnonce/digestをbase64エンコードしたりしなかったりするらしい。はてなのはする。

準備する情報

string username="hogehoge";
string password="pass";
DateTime created=DateTime.Now;

Nonce

明確な記述がないんだがたぶん40文字のランダムな英数。

string GenNounce(int length) {
    StringBuilder sb = new StringBuilder(length);
    for(int i = 0; i < length; i++) {
        sb.Append(char.ConvertFromUtf32(s_random.Next(0, 27) + 65));
    }
    return sb.ToString();
}

Didgest

string GenDigest(string pwd, DateTime created, string nonce) {
    string date_string = created.ToString("s");
    byte[] digest_bytes;
    using(SHA1Managed sha1 = new SHA1Managed()) {
        digest_bytes = sha1.ComputeHash(System.Text.Encoding.ASCII.GetBytes(nonce + date_string + pwd));
    }
    string didest_b64 = Convert.ToBase64String(digest_bytes);
    return didest_b64;
}

接続

string nonce = GenNounce(40);
string nonce_b64 = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(nonce));
string didgest = GenDigest(pwd, created, nonce);

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("http://b.hatena.ne.jp/atom/feed");
string wsse_header = string.Format(
    @"UsernameToken Username=""{0}"", PasswordDigest=""{1}"", Nonce=""{2}"", Created=""{3}""",
    username, didgest, nonce_b64, created.ToString("s"));
req.Headers.Add("X-WSSE", wsse_header);
req.Method = "GET";

//あとは適当に