공개키 기반 웹 로그인 구현 - recover pubkey


요약

ECDSA 알고리즘은 Signature만 가지고도 public key를 복원해낼 수 있는데, SubtleCrypto에는 그게 구현이 안되어있다. 다른 라이브러리로 구현해봄.

배경

이더리움과 Web crypto API는 같은 ECDSA를 제공하지만, 세부적인 항목에서 100광년 정도 차이가 있다.

  • 이더리움은 secp256k1을 쓰지만, web crypto는 지원 안한다. 이 글에선 표준 p256을 대체로 쓴다.
  • 이더리움은 keccak256을 해시 함수로 쓰지만, web crypto는 지원 안한다. 이 글에선 표준 sha256을 대체로 쓴다.
  • 이더리움은 대개 RFC6979을 쓰는듯 하지만, web crypto는 그렇지 않다. 이 글에선 문제되지 않는다.
    • 모든 이더리움 구현이 RFC6979를 쓰진 않는듯 하다. 예를 들면 AWS KMS는 안한다고 써놨음

https://en.wikipedia.org/wiki/Elliptic_Curve_Digital_Signature_Algorithm#Public_key_recovery

데모

구현

Client측: V 계산하기

https://bitcoin.stackexchange.com/questions/38351/ecdsa-v-r-s-what-is-v

에 의하면 여러 개의 Curve Point가 public key로 존재할 수 있는데, 이걸 구분하기 위해 v 값이 필요한 것으로 알고 있다. 클라이언트에서 이미 public key를 알고 있기 때문에 바로 계산해서 보내줄 수 있는데, 당장은 미구현 상태이고, 서버에서 v=0, v=1인 경우 두가지 모두를 계산하도록 구현해 뒀다.

Server측: pubkey 복원하기

당연히 직접 구현하진 않고, 구현되어 있는 라이브러리를 사용했다.