2011年9月24日土曜日

プロトコルと通信アーキテクチャ [ネットワーク概論 少しだけ]

先日、ネットワークのある部分において資料にまとめたので、せっかくだからブログ側にも転載。
まとめに関しては業務外だったので転載もOKなはず。



◎プロトコル
現在、インターネットやLANなどといった、コンピュータ間を接続するさまざまなネットワークが構築されています。
ネットワーク上での通信を可能にするためには、送る側と受け取る側でお互いに規約を定める必要があります。
その約束事が「プロトコル」です。

英語しか使えない人と日本語しか使えない人では会話ができないように、対応しているプロトコルが異なると通信することができません。
プロトコルを定めることで異機種間の相互接続が可能になります。


◎通信アーキテクチャ(ネットワークアーキテクチャ)
通信アーキテクチャとは、ネットワークシステムにおいて標準的に守るべき論理構造やプロトコル(通信規約)を体系的にまとめたものです。
有名なのは以下の2つです。

OSI基本参照モデル ・・・ ISO(国際標準化機構)が定めた枠組み
TCP/IP ・・・ インターネットで広く利用されてるプロトコル

上記2つについて説明する前に転送プロトコルの種類についての説明です。

次のページ:転送プロトコルの種類

phpで暗号化

会員制システムを構築する場合、パスワードは暗号化して保存するのが標準的。
それは、例えばIDとPWの組み合わせが漏洩したとしても認証出来ないからだと思う。
でも暗号化方式が単純なものだったりすぐに復号できるような方式であれば、せっかく暗号化してもあんまり意味がないので方式の選択は重要だと思う。
基本的な関数は以下のとおり。
md5
crypt
sha1

で、md5とsha1についてはNG。
それはphpのマニュアルサイトにも書いてある通りです。

よく使われるハッシュ関数である md5() や sha1() は、なぜパスワードのハッシュに適していないのですか?
MD5 や SHA1 そして SHA256 といったハッシュアルゴリズムは、 高速かつ効率的なハッシュ処理のために設計されたものです。 最近のテクノロジーやハードウェア性能をもってすれば、 これらのアルゴリズムの出力をブルートフォースで(力ずくで)調べて元の入力を得るのはたやすいことです。

最近のコンピュータではハッシュアルゴリズムを高速に「逆算」できるので、 セキュリティ技術者の多くはこれらの関数をパスワードのハッシュに使わないよう強く推奨しています。

結局暗号化してしまっても、高速なコンピュータを使えばランダムにアクセスして復号化してしまえるので推奨しません、ということだと思います。



で、残ったcryptを使うわけですがその使い方も気を付けないと危険です。
それもcryptのマニュアルページに書いてありますが、標準DESベースで暗号化してしまうと、最初の8文字が同じ文字列は同じ文字列として解釈されてしまうようです。
例えばこんな。

<?php
$salt = "wow";
if(crypt("mypassworddesuyo", $salt) == crypt("mypassword", $salt)) {
echo "same";
} else {
echo "not same";
}
// output same
?>

マニュアルによる推奨アルゴリズムはBlowfishとなっているのでそれに適合するようなsaltを使用すればOKなのかなと思います。
例えばこんな。

<?php
$salt = "$2a$07$usesomesillystringforsalt$";
if(crypt("mypassworddesuyo", $salt) == crypt("mypassword", $salt)) {
echo "same";
} else {
echo "not same";
}
// output not same
?>

PEAR::Blowfishを使えば可逆暗号化方式を使うことが出来ます。
※確か、OpenPNE使ってた気がします。


おまけ
よく使われるハッシュ関数では不適切だというのなら、 パスワードをどうやってハッシュすればいいのですか?
パスワードをハッシュするときに検討すべき重要な二点は、 その計算量とソルトです。 ハッシュアルゴリズムの計算コストが増えれば増えるほど、 ブルートフォースによる出力の解析に時間を要するようになります。

PHP には、 使うアルゴリズムを指定してハッシュを実行できる関数がふたつ組み込まれています。

まず最初のハッシュ関数は crypt() で、これはネイティブで数種のハッシュアルゴリズムに対応しています。 この関数を使うときには、選択したアルゴリズムが使用可能なことが保証されています。 PHP には各アルゴリズムのネイティブ実装が含まれているので、 仮にシステムがサポートしていない場合でもそのアルゴリズムを使えるのです。

もうひとつのハッシュ関数は hash() で、 これは crypt() よりもさらに多数のアルゴリズムやその亜種に対応しています。 しかし、crypt() が対応しているアルゴリズムのいくつかには未対応です。 Hash 拡張モジュールは PHP に同梱されていますが、コンパイル時に無効化することもできます。 したがって、常に使えるとは限りません。一方 crypt() は PHP のコアに含まれているので、いつでも使えます。

パスワードのハッシュ用として推奨するアルゴリズムは Blowfish です。 これは MD5 や SHA1 に比べて圧倒的に計算量が多く、それでいてスケーラブルだからです。


ソルトとは?
暗号理論におけるソルトとは、ハッシュ処理の際に追加するデータのことです。 事前に計算済みのハッシュとその元入力の対応表 (レインボーテーブル) で出力を解析される可能性を減らすために利用します。

端的に言うと、ソルトとはちょっとした追加データです。 これをつけるだけで、ハッシュをクラックするのが劇的に難しくなります。 事前に計算済みのハッシュとその元入力を大量にまとめた表が、オンラインで多数公開されています。 ソルトを使えば、そのハッシュ値がこれらの表に含まれている可能性を大きく減らすことができます。

2011年9月18日日曜日

phpでのXMLパース コロン(名前空間)と@マークつき属性(attributes)

最近いろいろとAPIを使うことが多いのだけど、基本的にはjsonで返してもらいjsで処理をする。
でも、たまにAPIによってはxmlでしか返ってこないことがあり、phpのSimpleXMLをつかってパースを必要が出てきたするのだけど、"dc:date" のようにコロンがついている要素は処理に一工夫しないとうまく取得できなかったりする。

$xml = simplexml_load_file($url);
echo $xml->item[0]->dc:date; // これでは表示されない

で、いろいろ調べてみた結果、コロン自体を置換等で消してしまう方法とchildrenメソッドで名前空間を指定してあげる方法があるようです。

(1)「:(コロン)」を置換する
具体的にはこんな感じ。データを取得するだけなのだから方法としては悪くないのかなぁと思った。
$xml_tmp = file_get_contents($url);
$xml_tmp = str_replace(":", "_", file_get_contents($xml_tmp));
$xml = simplexml_load_string($xml_tmp);
echo $xml->item[0]->dc_date;

(2)childrenメソッドを使う
こっちのほうがいいのかなと思って結局、この前つまづいたときはこっちにしました。
php.net - children
つまりは名前空間を定義しているURLを children メソッドに渡すか、prefixを渡すかのよう。
dc (Dublin Core) 名前空間は xmlns:dc="http://purl.org/dc/elements/1.1/" と宣言されてたのでこれを引数として渡して値を取得。
$xml = simplexml_load_file($url);
$i = 1;
while (isset($xml->item[$i]->title)) {
$arr['item'][$i]['title'] = htmlspecialchars($rdf->item[$i]->title);
$node = $rdf->item[$i]->children('http://purl.org/dc/elements/1.1/');
$arr['item'][$i]['date'] = htmlspecialchars($node->dc);
$i++;
}
print_r($arr);

prefixを渡す場合は試してないけど、
「$rdf->item[$i]->children('http://purl.org/dc/elements/1.1/');」のところを
「$rdf->item[$i]->children('dc', true);」
に変えればいいのかな?

参考:PHPでコロンを含むXML要素名を扱う方法


また、属性内(attributes)の要素にアクセスするにはそのままattributesメソッドを使った。
echo (string)$xml->item[$i]->attributes()->Name;
echo (int)$xml->item[$i]->attributes()->Number;


xml、難しいっすね。。


2011年9月9日金曜日

Twitter、アクティブユーザー数が1億人を超えたと発表

1カ月に1度以上ログインしているユーザーは1億人以上だが、そのうち40%はツイートはしていない。

米Twitterは9月8日(現地時間)、アクティブユーザー数が1億人を超えたと発表した。そのうち半数以上が毎日ログインしているという。40%はログインしても自らはツイートせずに情報を閲覧している。同社は1カ月に1回以上Twitterにログインしたユーザーをアクティブユーザーと定義する(サードパーティー製アプリからのログインも含む)。

Twitterは同日、メディア向けの非公式な発表会を行った。この発表会に参加した米ブログメディアのThe Next Webによると、Twitterのディック・コストロCEOはさらに幾つかの数字を披露したという。

ログインの55%はモバイル端末からのもの
・5日当たりのツイート数は50億件
・ユニークビジター数は1カ月当たり4億人
なお、Twitterは全ユーザーアカウント数は発表していないが、4月の時点でアカウント数が2億を超えたと公式に認めている。

2011年09月09日 08時34分 更新 ITmediaより

用途は分かれますよね。
僕は基本的にはニュースの閲覧として使ってますのであんまりつぶやかないですね。

そして基本はスマホですね。
PCでわざわざtwitter見る人が45%いたことが逆に驚き。



2011年9月8日木曜日

無題

いつも行かなくていいし、いつもいなくてもいい。
けど、ずっと必要とされる。
そんな場所を作りたい。

2011年9月7日水曜日

ソーシャルブックマークサイト【500:g(フィグ)】

ソーシャルブックマークサイト【500:g(フィグ)】なるサイトを発見しました。
このサイトは「フィグ」って読むのかな。
無料会員登録してお気に入りのサイトを登録し、それがランキング表示されたりという基本的には普通のソーシャルブックマークなのだけど、ブックマーク一覧を見るマイページのデザインを変更することが出来る。
そのデザインを購入したり、登録出来るデザインを増やすために有料会員制があるようす。
この有料会員向け特典がこれからどんどん増えてくんだろうなぁと思った。



最近こういったアイディアをとりあえず具現化した(と勝手に思ってるんだけど)サービスがすごく気になる。
副業の手始めに、というのもあるけど、自分でサービスを考えて計画をたてて実行するというのは、身一つで仕事をしていくためにも必要だなぁと思う。
組織に所属していても結局は自分次第なのだなぁと最近すごく思う。
結局は自分にどういった能力があるのか、繋がりがあるのか、だと。
そのためにはまず、自分のアイディアを少しでも具現化していこうと思う。



2011年9月6日火曜日

音声認識 GoogleAPI AmiVoiceSP

Android端末などでもみられるけど、Googleは少し前から音声認識をつかった検索を組み込んでいる。 Androidアプリ開発用として、音声認識APIを公開もしている。
http://googlejapan.blogspot.com/2009/12/api-android.html

音声認識がもっと普及していけば、ネットを通じたサービスも変わってくんだろうなぁと思った。

例えば、Ustream上でのソーシャルストリームが音声認識と連動すれば普通に会話しているようにソーシャルストリームが流れていくし、ボーカロイドと組み合わせれば自分の音声をもとに別な声で会話が進んでいったりもする。
もうそういうのあるのかな。
ないのならそういうサービスを作ってみよう。

GoogleTVやSamsung、LGで有名なスマートTVでも、テレビ番組を見ながらTwitter連動とかあるけど、普通に叫び声とかも音声認識しちゃって書き込んでしまったりするんだろうな、と思ったりする。



先日、体調を崩して病院に行き点滴を3本うってきた。
お医者さんは僕に症状を聞く度にそれをマイクみたいなのに復唱してて「なんだろう?」と思って覗きこんだら話した声がカルテに書きこまれていた。
音声認識に関連したサービスを模索中だった僕は「おお!」と思って点滴打ち終わったあとに看護士さん経由でその製品の名前を教えてもらた。

それがこれ「あなたの声が文字になる! 音声認識ソフト「AmiVoiceSP」



病院とか大学とか特別な施設でしか使えないと思ったんだけど、普通に売られてるんだね。
一般家庭ではなかなか購入する機会がないかもしれないけどなんか欲しいなぁ。




2011年9月4日日曜日

facebook Graph API

twitterに続き、facebook上での話題などを調べたく、facebookAPIについて探したのですがなかなか見付からず。 いろいろ調べてたみたので備忘録を兼ねてのメモです。

facebook上での話題を調べるなら「ウォール検索」と「チェックポイント検索」が必要かなと思います。 ウォール検索はfacebookAPIのうちの「Graph API」というのを使います。

特に認証は必要ではないのですごく簡単に導入できます。

https://graph.facebook.com/searchに各種欲しいものに関するパラメータをつけることでいろいろ情報をとることが出来ます。
ウォール検索だったら、
https://graph.facebook.com/search?q=検索したいキーワード&type=post
みたいな感じです。

ウォール検索結果にプロフィール画像を付けたい場合は、
https://graph.facebook.com/ユーザ名/picture
な感じ。

ほかは、こんな感じ。

【基本フォーマット】
https://graph.facebook.com/search?q=QUERY&type=OBJECT_TYPE

【サポートしている検索】
All public posts: https://graph.facebook.com/search?q=watermelon&type=post
People: https://graph.facebook.com/search?q=mark&type=user
Pages: https://graph.facebook.com/search?q=platform&type=page
Events: https://graph.facebook.com/search?q=conference&type=event
Groups: https://graph.facebook.com/search?q=programming&type=group
Places: https://graph.facebook.com/search?q=coffee&type=place¢er=37.76,122.427&distance=1000
Checkins: https://graph.facebook.com/search?type=checkin

※チェックインはこれではとれなかった・・・。


認証系はログインしないと見れない情報やlikeしたり書き込んだりなどです。
また次回書きます。

オススメ!!レンタルサーバー ★月額105円〜/容量最大30GB/機能満載! ロリポップ!レンタルサーバー ★
格安ドメイン取得サービス─ムームードメイン─ エンジニア転職なら「all engineer」
「スマートビルダー」smartbuilder.jp