BitAuth の仕組み
(追記)以下で説明している BitAuth は、 BitAuth 1.0 であって、最新の BitAuth 2017 とは仕様がかなり異なります。
BitAuth は、Bitcoin と同様の楕円曲線暗号を用いた、認証の仕組みである。bitpayによって開発された。
パスワードとEメールによる認証では、サーバーにemailとパスワード(実際にはそのハッシュ値)を保管し、ユーザーから送られてきたものと検証することによって認証を行うが、それにはメールアドレスやパスワード流出のリスクがサービス提供側に集中する。
しかし BitAuth では、秘密情報をサーバーに教える必要なく認証が可能となり、秘密情報管理の責任をクライアント側が持つことができる。
BitAuth の一般的な認証フロー
- 鍵生成:secp256k1 の曲線上で、秘密鍵・公開鍵のペアを生成する
- SIN の作成:公開鍵から SIN を作成する(フローは後述)
- SIN の共有:サーバーに SIN を登録。実装では、公開鍵をサーバーに送信し、サーバー側で SIN を導出している。
- リクエストの送信:ヘッダーの x-signature をセットし、HTTP 上でリクエストを送信する
フローを見てみると、大枠は 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.