http://q.hatena.ne.jp/1358865910


で質問したものです。

objective-cからサーバーのデータを取得するプログラムを作ってます(サーバー側はPHPを使用してます)

objective-cから、暗号のキーを飛ばし、PHPでそれを判定したあとに、データを送りたいと思うのですが、常に一定の暗号では気づかれてしまうため、可変にしたいと思います。
やり方をお教えいただけますでしょうか?

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/01/27 04:06:28
  • 終了:2013/02/03 04:10:03

回答(2件)

id:oil999 No.1

oil999回答回数1728ベストアンサー獲得回数3202013/01/27 09:37:22

ポイント50pt

ここで具体的な作成コードを書いてしまうと、せっかくの暗号が解読されてしまうので、アルゴリズムのアイデアのみを回答することにします。

よくある方法としては、ハッシュ関数を使います。
たとえば、年月日時分(文字列)とプログラム固有の文字列(クライアントプログラムのファイルサイズやMD5値)を結合し、SHA-1などのハッシュ関数でハッシュ値を計算し、これを認証キーとします。
サーバ側のPHPでも同様の方法でハッシュ値を計算し、クライアントから送られてきた認証キーと合致すれば認証成功とします。
SHA-1以外のハッシュ関数もあるので、適当に選んで使ってみてください。

Objective-CでSHA-1を計算するにはCC_SHA1を使います。
PHPでは、sha1関数が用意されています。

【参考】アメーバブログなどにAtom APIを使ってアクセス

http://hiiro-game.seesaa.net/article/212744595.html

id:makocan

これ、うまい方法ですね。なるほどと思いました!

2013/01/27 18:21:29
id:psne No.2

ぽけっとしすてむ回答回数441ベストアンサー獲得回数2362013/01/27 12:16:46

ポイント50pt

(1)サーバー側にて使い捨てのトークンを発行
(2)端末側で保存してあるパスワード等とトークンを利用して認証フレーズを作成、送信する
(3)サーバー側でも、同じ様にパスワード等とトークンを利用して認証フレーズを作成し、受信した認証フレーズと照合する

この方法では、サーバー・端末の時刻同期の必要がなく、トークンを使い捨てにすることにより確実に1度だけ認証処理が行うことが可能です。

常に一定の暗号では気づかれてしまうため

こちらが、どのような想定かで全ての動作が無意味になってしまいます。
例えば、認証コードが固定かつ通信中のパケットを拾えてしまえば意味が無い物になります。
また、サーバーや端末側から仕様が解析されてしまった場合も同様です。
通信についてはSSLを利用する必要があるかもしれません。
libcurlをiPhoneアプリからつかう方法 (ついでにopensslも) | tech.kayac.com - KAYAC engineers’ blog

他1件のコメントを見る
id:oil999

トークンの発生アルゴリズムを回答しておられませんが、一般的にはハッシュ関数を使って作られます。したがって、No.1の私の回答と同じ内容ということになります。

2013/01/27 19:28:59
id:psne

トークン生成方法についてはSHA-1、MD5、日付+プロセスID、極端に言えば日付を平文でも、ユニークな値が生成できれば良いかと思います。
(上に挙げた中で現在のベターな方法はSHA-1という事も明記しておきます。)
また、No1の方法では端末とサーバー側で1分以上(最短でも1秒)ずれていると認証が出来なくなります。
端末がiPhone等モバイル端末の場合、電波状況や通信経路の影響がより大きくなります。
そのために(1)にて、共通で使用するトークンを生成する手順を踏んでいます。
なお、No2の手順自体はTwitterOAuthなど、広く使われている方式となります。

2013/01/29 08:54:27

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません