One or Zero?

興味のある様々なことについて

BitAuth の仕組み

(追記)以下で説明している BitAuth は、 BitAuth 1.0 であって、最新の BitAuth 2017 とは仕様がかなり異なります。

BitAuth は、Bitcoin と同様の楕円曲線暗号を用いた、認証の仕組みである。bitpayによって開発された。

パスワードとEメールによる認証では、サーバーにemailとパスワード(実際にはそのハッシュ値)を保管し、ユーザーから送られてきたものと検証することによって認証を行うが、それにはメールアドレスやパスワード流出のリスクがサービス提供側に集中する。

しかし BitAuth では、秘密情報をサーバーに教える必要なく認証が可能となり、秘密情報管理の責任をクライアント側が持つことができる。

BitAuth の一般的な認証フロー

  1. 鍵生成:secp256k1 の曲線上で、秘密鍵・公開鍵のペアを生成する
  2. SIN の作成:公開鍵から SIN を作成する(フローは後述)
  3. SIN の共有:サーバーに SIN を登録。実装では、公開鍵をサーバーに送信し、サーバー側で SIN を導出している
    • HTTPヘッダの x-identityに公開鍵を、 x-signatureURI秘密鍵で署名したものをセットしてサーバーに登録。
  4. リクエストの送信:ヘッダーの x-signature をセットし、HTTP 上でリクエストを送信する
    • ユニークなnonceを生成(larger than previous)
    • リクエストボディに nonce を含める
    • URIとBODYを文字列として連結して、秘密鍵で署名し、 x-signatures にセットする
    • x-identity には検証用の公開鍵をセットする。

フローを見てみると、大枠は Bitcoin と変わらないことが分かる。

SIN とは

SINは、System Identification Number(または Secure Identity Number)の略で、Bitcoin におけるアドレスのようなものである。SIN は公開鍵 k1 から次のように生成できる。

base58check( 0x0F + 0x02 + ripemd160( sha256( k1 ) )

より細かいフローはこちらのページを参照。

実装

bitpay オリジナルの実装は最近はあまりメンテナンスされていない模様。 Pull request も放置されている。 GitHub - bitpay/bitauth: Authenticate with web services utilizing the same strategy as Bitcoin.

webアプリ認証用ミドルウェアである passport のモジュールもあり。

GitHub - martindale/passport-bitauth: BitAuth authentication strategy for PassportJS.