で質問したものです。
objective-cからサーバーのデータを取得するプログラムを作ってます(サーバー側はPHPを使用してます)
objective-cから、暗号のキーを飛ばし、PHPでそれを判定したあとに、データを送りたいと思うのですが、常に一定の暗号では気づかれてしまうため、可変にしたいと思います。
やり方をお教えいただけますでしょうか?
ここで具体的な作成コードを書いてしまうと、せっかくの暗号が解読されてしまうので、アルゴリズムのアイデアのみを回答することにします。
よくある方法としては、ハッシュ関数を使います。
たとえば、年月日時分(文字列)とプログラム固有の文字列(クライアントプログラムのファイルサイズやMD5値)を結合し、SHA-1などのハッシュ関数でハッシュ値を計算し、これを認証キーとします。
サーバ側のPHPでも同様の方法でハッシュ値を計算し、クライアントから送られてきた認証キーと合致すれば認証成功とします。
SHA-1以外のハッシュ関数もあるので、適当に選んで使ってみてください。
Objective-CでSHA-1を計算するにはCC_SHA1を使います。
PHPでは、sha1関数が用意されています。
(1)サーバー側にて使い捨てのトークンを発行
(2)端末側で保存してあるパスワード等とトークンを利用して認証フレーズを作成、送信する
(3)サーバー側でも、同じ様にパスワード等とトークンを利用して認証フレーズを作成し、受信した認証フレーズと照合する
この方法では、サーバー・端末の時刻同期の必要がなく、トークンを使い捨てにすることにより確実に1度だけ認証処理が行うことが可能です。
常に一定の暗号では気づかれてしまうため
こちらが、どのような想定かで全ての動作が無意味になってしまいます。
例えば、認証コードが固定かつ通信中のパケットを拾えてしまえば意味が無い物になります。
また、サーバーや端末側から仕様が解析されてしまった場合も同様です。
通信についてはSSLを利用する必要があるかもしれません。
libcurlをiPhoneアプリからつかう方法 (ついでにopensslも) | tech.kayac.com - KAYAC engineers’ blog
トークンの発生アルゴリズムを回答しておられませんが、一般的にはハッシュ関数を使って作られます。したがって、No.1の私の回答と同じ内容ということになります。
トークン生成方法についてはSHA-1、MD5、日付+プロセスID、極端に言えば日付を平文でも、ユニークな値が生成できれば良いかと思います。
(上に挙げた中で現在のベターな方法はSHA-1という事も明記しておきます。)
また、No1の方法では端末とサーバー側で1分以上(最短でも1秒)ずれていると認証が出来なくなります。
端末がiPhone等モバイル端末の場合、電波状況や通信経路の影響がより大きくなります。
そのために(1)にて、共通で使用するトークンを生成する手順を踏んでいます。
なお、No2の手順自体はTwitterOAuthなど、広く使われている方式となります。
これ、うまい方法ですね。なるほどと思いました!
2013/01/27 18:21:29