Zaif(ザイフ)のAPIを使って、APIの仕組みを解説します。
使うのはザイフのAPIですが、他の取引所でも認証方法などを除けば、ほぼ似たような仕組みを使っています。なかなかうまくいかない場合は、仕組みを理解していれば、解決の糸口が見つかるかもしれません。
APIで使われている仕組みは、電子署名という仕組みです。詳細は後述しますが、簡単にいうと、作ったデータを暗号化して送信し、サーバーで暗号化が正しいかを確認してもらい、送った情報に対する返事(レスポンス)をもらうことです。
APIの種類
まず、APIには公開情報APIと取引APIの2つあります。
公開情報API
公開情報APIとは、主に自分の口座と関連性のない情報を取得表示するためのAPIです。
たとえば、現在のBTCの価格(各通貨の価格)、約定したデータ情報など、一般公開しても問題ないデータです。
取引API
取引APIは、自分の口座を利用した情報を含んでおり、売買注文や口座残高取得のためのAPIです。
このAPIは、データを改ざんされたりしないように電子署名を使ってやり取りを行います。これが公開情報APIと違う部分です。
取引APIを使うには、事前にAPIキーの発行が必要です。マイページにログインして発行する事ができます。
APIキーが他の人にばれてしまうと、アカウントからお金を抜き取られてしまう可能性もあるので、取り扱いには気を付けましょう。
APIで使われている電子署名の技術
ザイフの電子署名で使っているのは、HMAC-SHA512という方法です。
HMAC-SHA512とは、ハッシュ関数にSHA512を利用したメッセージを認証するための情報(メッセージ認証コード)。PHPには、hash_hmacという関数が用意されています。
SHA512とは、まず、SHAは、Secure Hash Algorithmの略で、SHA-2(SHA-1を改良した暗号学的ハッシュ関数)のバリエーションの一つで、512ビットで値を返してくれます。
暗号学的ハッシュ関数とは、ハッシュ関数の中でも暗号化するのに適しているものです。
※1文字変更するだけ、生成されるハッシュ関数が大きく変わります。
HMACをHTTPリクエストで送受信
これらの技術を使ったAPIでのデータのやりとりは以下のように行われます。
1.送信者は、HMAC-SHA512でハッシュ作成後に、秘密鍵でデータを暗号化します。
2.送信者は、1の暗号化データと平文データと公開鍵の3つを受信者に送ります。
3.受信者は、1の暗号化データを公開鍵で復元します。
4.受信者は、3の復元データと送られてきた平文を比較して一致したら正しいデータと判断します。
※上記の暗号化データ、公開鍵、平文は、基本はHTTPSリクエストで送ります。でないと、平文がばれてしまい署名以前の問題。
上記のデータのやりとりは、HTTPのリクエストメッセージで送信されます。
リクエストメッセージは下記の3つ構造から成り立っています。
- リクエストライン
何をどうしたいかの情報を1行でリクエスト。 - ヘッダー
暗号化した署名、APIキーは、指定のキー名でリクエストラインに含める。 - メッセージボディ
平文は、ボディに設定(ヘッダーとメッセージボディの間には空白が入ります)。
リクエストメッセージを送信すると、ザイフのサーバーで認証確認をして、レスポンスを返してくれます。
レスポンスメッセージもリクエストメッセージと同じような構造をもっており、最初の1行目がステータスラインになっています。
ステータスコードには、よくみる200(OK)や404(ページなし)などが設定されています。
APIもこうしたやりとりを行って売買などをおこなっています。
※正規表現やURLをbase64エンコードしたときに、+や/がかぶってしまうので、-や_を扱うこともあります。
【Zaif(ザイフ) API】PHPで署名をHTTPリクエストする
電子署名参考:http://www.soumu.go.jp/main_sosiki/joho_tsusin/top/ninshou-law/pdf/090611_1.pdf