Successfully reported this slideshow.
Your SlideShare is downloading. ×

Community Open Day 沖縄

Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Ad
Upcoming SlideShare
Erlangご紹介 websocket編
Erlangご紹介 websocket編
Loading in …3
×

Check these out next

1 of 41 Ad

Community Open Day 沖縄

Download to read offline

TouchDevelopでまじめにプログラミングしてみます。

すべてライブラリとして公開されています。TouchDevelopでepoch util, binary operators, hmac, oauth, sha1 などで見つかります。

TouchDevelopでまじめにプログラミングしてみます。

すべてライブラリとして公開されています。TouchDevelopでepoch util, binary operators, hmac, oauth, sha1 などで見つかります。

Advertisement
Advertisement

More Related Content

Similar to Community Open Day 沖縄 (20)

Advertisement

Community Open Day 沖縄

  1. 1. 車輪の国、 TouchDevelopの少女 tmyt COD沖縄 13/5/11
  2. 2. about me •  tmyt •  東京らへんで組み込みシ ステム開発してます •  最近はXamarin 2.0とか 触ったりしてます •  好き: C++, C#, Delphi, ZSH •  Twitter: @tmyt •  Github: tmyt
  3. 3. 今日はなすこと —  TouchDevelopとはなんぞや —  TouchDevelopで学習する —  bit演算 —  ハッシュ関数 —  認可プロトコル
  4. 4. Touch develop is … 何 —  Microsoft Reserchの研究成果 —  プログラミングを学習するためのツール —  主なターゲットはタッチデバイス —  キーボードがなくてもボタン押してるだけでOK
  5. 5. こんなの DEMO
  6. 6. TouchDevelopの特徴 —  『やりたいこと』が主体 —  各種命令は高度に抽象化されている —  ひとつの命令で画像を表示したりできる —  あえて言うならCISCアセンブリ言語 —  成果物はStore AppsなどにExportできます
  7. 7. TouchDevelopで —  出来ること —  文字や画像を表示する —  四則演算する —  三角関数を使う —  出来ないこと —  ビット演算をする —  IntやCharなどを使い分ける —  53bitを超える整数を扱う
  8. 8. 今日の目標 TouchDevelopでOAuth認証をしてみる
  9. 9. あるひ —  *「TouchDevelopでOAuth認証ってできる?」 —  僕「できるんじゃない?」
  10. 10. OAuth認証に必要なもの —  HMAC-SHA1ダイジェスト —  Authorization: OAuth ヘッダ —  文字列をUTF-8バイト列として処理 —  現在時刻をEpoch Timeで扱う
  11. 11. TouchDevelopでできる? —  HMAC-SHA1ダイジェスト —  SHA1ハッシュ —  生成できない —  HMAC —  生成できない —  Authorization: OAuth ヘッダ —  できる —  文字列をUTF-8バイト列として処理 —  できない —  現在時刻をEpoch Timeで扱う —  できない
  12. 12. TouchDevelopでできる? —  SHA1ハッシュ —  生成できない —  ビット演算ができない —  ライブラリとしての実装もない —  HMAC —  ハッシュアルゴリズムが無いため実装がない —  文字列をUTF-8バイト列として処理 —  UTF-16文字列を変換する関数は実装がある —  現在時刻をEpoch Timeで扱う —  現在時刻をDateTime型で取得出来るので変換する
  13. 13. OAuthするために 1.  Epoch Timeを実装する 2.  ビット演算を実装する 3.  SHA1ハッシュを実装する 4.  HMACダイジェストを実装する 5.  UTF-16 → UTF-8変換を実装する 6.  OAuthを実装する
  14. 14. Chapter.I Epoch Timeの取得
  15. 15. Epoch Timeって? —  いわゆるUNIX時間 —  1970年1月1日からの経過秒数として表現 —  タイムゾーンのオフセットは存在せず常にUTC
  16. 16. TouchDevelopの時刻表現 —  TouchDevelopでは時刻を表現できる —  イメージとしてはJavaScriptのDate型 —  もちろんEpoch Timeへの変換は不可
  17. 17. Epoch Timeへの変換 1.  UTCで現在時刻を取得する 2.  1970年からの経過日数を単純に計算する 3.  日付×36400+0時からの経過秒数を計算する —  あれ、TouchDevelopって閏年の判定ができない —  それぐらいは軽く作りましょう —  ここまでで約1時間
  18. 18. Chapter.II ビット演算
  19. 19. ビット演算とは —  ある値をビット列で表現しそのビットごとに論理演 算を適用する —  例えば —  15(10) AND 20(10) = 4(10) —  15(10) OR 20(10) = 31(10) —  15(10) XOR 20(10) = 27(10) —  C言語などではビット演算演算子が存在する
  20. 20. ビットの配列へ変換 —  ビット演算には2進数への変換が必要 —  手計算で2進数へ変換する場合と同様に実装する List<int>  ToBinary(int  n)  {   var  b  =  new  List<int>();   while  (n  !=  0)  {   b.Add(n  %  2);   n  /=  2;   }   return  b.Reverse().Take(32).ToList();   }  
  21. 21. ビット演算を実装する —  任意の数値をビット配列に変換できればあとはビッ トごとにAND, OR, XOR, NOTを実装するだけ —  SHA1ハッシュの計算にはビットシフトも必要 —  同様にして実装します —  だいたいここまでで30分
  22. 22. Chapter.III SHA1ハッシュ
  23. 23. SHA1ハッシュ —  Secure Hash Algorithm 縮めてSHA —  ハッシュ関数のひとつ —  入力に対し一意な160bitの値を出力する —  余談 —  SHA1はNISTが2010年よりDeprecatedとしています —  今後はSHA256を使うのをおすすめします
  24. 24. SHA1の生成 —  こんな雰囲気です —  バッファを64の倍数に拡張 —  バッファを8bitごとに区切り —  StepA, B, C, Dの4パターンで演算 —  格段の値を合計 —  32bitの値5個を連結して160bitに
  25. 25. TouchDevelopで実装する —  先ほど作ったビット演算が活躍します —  AND, OR, XOR, SHR, SHL —  右回転シフトも必要なので作ります —  定数に16進数は使えないのですべて10進にします —  コピペも出来ないので間違えないように入力します —  加算結果は最大で33bitになります —  TouchDevelopの数値型は53bit精度の浮動小数 —  4294967295(0xFFFFFFFF)とANDを取って切り捨てる
  26. 26. Chapter.IV HMACダイジェストを計算する
  27. 27. HMACダイジェスト —  メッセージとキーから固定長のデータを生成する —  サーバから提供されたデータに対してパスワードを 使って演算し、それをサーバに送信とかして使う —  パスワードはユーザ/サーバ両者に既知の値 —  サーバはデータ/パスワード共に既知であるためパス ワードを直接ネットワーク上に流さずとも検証可能 —  結局内部でSHA1とか使ってます
  28. 28. HMAC-SHA1 —  HMACの内部アルゴリズムとしてSHA1を使う —  アルゴリズムの流れ —  鍵と0x5cをXORで演算 … ① —  鍵と0x36をXORで演算しメッセージと結合 … ② —  ②へハッシュ関数を適用 … ③ —  ①と③を結合 … ④ —  ④へハッシュ関数を適用しMACとする
  29. 29. TouchDevelopで実装する —  SHA1はすでに実装しました —  文字列からバイナリ生成はすでに実装しました —  ビット演算はすでに実装しました —  これらよりアルゴリズムを忠実に実装します —  飽和演算なども不要なため素直に実装できます
  30. 30. Chapter.V UTF-8文字列を作る
  31. 31. UTF-8文字列 —  インターネットの世界ではUTF-8が流行 —  TouchDevelopの内部はUTF-16です —  OAuthでアクセスする先は大抵UTF-8 —  UTF-8文字列が必要になります
  32. 32. 文字列の扱い —  TouchDevelopでは文字列はUTF-16 —  UTF-8のINT配列にするには? —  web→url encodeを使って変換する —  UTF-16のINT配列を作って変換する —  最終的には後者で実装しています —  後者の方が断然速いです
  33. 33. UTF-16からUTF-8への変換 —  UTF-8 ⇔ UTF-16は相互に変換可能   void  to_u8(int  c)  {          if(c  <  128)  chars.Add(c);          else  {                  if(c  <  2048)  chars.Add(((c  >>  6)  &  31)  |  192);                  else  {                          chars.Add((c  >>  12)  |  224);                          chars.Add(((c  >>  6)  &  63)  |  128);                  }                  chars.Add((c  &  63)  |  128);          }   }  
  34. 34. Chapter.VI OAuthを実装する
  35. 35. OAuthとは — 認可プロトコル —  認証プロトコルではない —  第三者にリソースへのアクセスを許可する —  第三者がユーザのCredentialを知ることはできない
  36. 36. OAuthの仕組み —  ConsumerはProviderに仮トークンを要求 —  Consumerは仮トークンを使って認証URLを要求 —  Userは認証URLで自分のアカウント使いログイン —  得られたVerifierをConsumerへ通知 —  ConsumerはVerifierを用いProviderへ実トークンを 要求 —  Providerはトークンを発行しConsumerのアクセス を認可する
  37. 37. 結構めんどくさい
  38. 38. 大抵ライブラリがあります —  有名な言語には大抵OAuthの実装はあります —  C++, Java, C#, Objective-C, PHP, Perl, Ruby, … —  OAuthの手実装は面倒なのでライブラリ使うのがお すすめです —  TouchDevelopにはそんなものありません
  39. 39. TouchDevelopでの実装 —  OAuthで必要なものはこれまでに用意しました —  HMAC-SHA1 —  Epoch Time —  UTF-8 —  仕様書通りに実装するだけです —  できあがったものはTouchDevelopライブラリとして 公開済みです
  40. 40. DEMO できたものがこちら
  41. 41. まとめ —  TouchDevelopでプログラミングを学習しました —  TouchDevelopらしい使い方ではありません —  あえて実装することで理解が深まります —  C言語の本でビット演算実装しないでしょ? —  制限された環境だと楽しくなってくる —  学習するための車輪は惜しまない

×