[DEV] ECDSA 서명으로 JWT 토큰 생성 및 검증하기

in #sct5 years ago (edited)


안녕하세요. 안피곤입니다.

ECDSA는 암호화폐에 가장 많이 사용되는 암호화 알고리즘입니다. 그리고 RSA 보다 성능이 더 좋다고 알려져 있습니다. 그리고 JWT(JSON Web Token)은 보안 및 인증에 가장 많이 사용되고 있습니다. 이 2개를 가지고 토큰을 생성하고 인증 하는 방법을 구현합니다.

보통은 JWT 생성에 SHA 해시 알고리즘을 사용하는 HMAC을 사용합니다. 이것은 단방향 암호화 방식입니다. 하지만 ECDSA를 사용하면 비대칭키를 사용하기 때문에 부인 방지 및 메세지 인증을 처리 할수 있습니다. 참고로 부인은 여러분이 생각하는 그 부인은 아닙니다.



* * *


구현을 위해선는 아래 두 라이브러리가 필요합니다.

const jwt = require("jsonwebtoken");
const ECDSA = require('ecdsa-secp256r1');

참고:
https://www.npmjs.com/package/jsonwebtoken
https://www.npmjs.com/package/ecdsa-secp256r1


ECDSA 키 생성

const privateKey = ECDSA.generateKey()
 
privateKey.toJWK()
/*
{ kty: 'EC',
  crv: 'P-256',
  x: '4YdUIhIDncVu5tScgjxthiXOO_el11FWb56gR3qnhVQ',
  y: 'UyEvWOJbMZa9PtggGeRC9iQcAzOZZsyXpFE1qaF6jFk',
  d: 'TYVI2fW-nHSPGCx0MhWasg2Ggiyl1E_Kq4D1A5LmkxU' }
*/
 
privateKey.asPublic().toJWK()
/*
{ kty: 'EC',
  crv: 'P-256',
  x: '4YdUIhIDncVu5tScgjxthiXOO_el11FWb56gR3qnhVQ',
  y: 'UyEvWOJbMZa9PtggGeRC9iQcAzOZZsyXpFE1qaF6jFk' }
*/
 
privateKey.toPEM()
/*
-----BEGIN PRIVATE KEY-----
MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgTYVI2fW+nHSPGCx0
MhWasg2Ggiyl1E/Kq4D1A5LmkxWhRANCAAThh1QiEgOdxW7m1JyCPG2GJc4796XX
UVZvnqBHeqeFVFMhL1jiWzGWvT7YIBnkQvYkHAMzmWbMl6RRNamheoxZ
-----END PRIVATE KEY-----
*/
 
privateKey.asPublic().toPEM()
/*
-----BEGIN PUBLIC KEY-----
MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE4YdUIhIDncVu5tScgjxthiXOO/el
11FWb56gR3qnhVRTIS9Y4lsxlr0+2CAZ5EL2JBwDM5lmzJekUTWpoXqMWQ==
-----END PUBLIC KEY-----
*/
 
privateKey.toCompressedPublicKey()
/*
A+GHVCISA53FbubUnII8bYYlzjv3pddRVm+eoEd6p4VU
*/


ECDSA 서명 하기

const message = { text: 'hello' }
privateKey.sign(JSON.stringify(message))
/*
lY3Lf9xDtcsqom5IKu+ZyikxeYHlEuxnPfme4lMxp76NMkIm5BiLxVjbqBSo4itfT/LEuBCzMXl11cB0w/X8dA==
*/


ECDSA 서명 검증

const key = 'A+GHVCISA53FbubUnII8bYYlzjv3pddRVm+eoEd6p4VU'
const publicKey = ECDSA.fromCompressedPublicKey(key) // or ECDSA.fromJWK
const message = { text: 'hello' }
const signature = 'lY3Lf9xDtcsqom5IKu+ZyikxeYHlEuxnPfme4lMxp76NMkIm5BiLxVjbqBSo4itfT/LEuBCzMXl11cB0w/X8dA=='
 
publicKey.verify(JSON.stringify(message), signature)
/*
true
*/



* * *


JWT 토큰 생성하기

ES256는 P-256 곡선과 SHA-256 해시 알고리즘을 사용하는 ECDSA입니다. 다른 알고리즘은 여기 문서를 참고하세요.

const privateKey = fs.readFileSync('private.key'); // or privateKey.toPEM();
const payload = { accessKey: 'hello' };
const jwtToken = jwt.sign(payload, privatekey, { algorithm: 'ES256' });


JWT 토큰 검증하기

const publicKey = publicKey.toPEM();
const result = jwt.verify(jwtToken, publicKey, { algorithm: 'ES256' });


JWT 토큰 복호화하기

jwt 토큰 복호화 하여 내용을 확인합니다.

const decodedToken = jwt.decode(jwtToken, { algorithm: 'HS256' });



해피 코딩하세요~!


Sort:  

해피 코딩이라니... ㅋ 즐거운 불금 되세요^^

Congratulations @anpigon! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 10000 upvotes. Your next target is to reach 15000 upvotes.

You can view your badges on your Steem Board and compare to others on the Steem Ranking
If you no longer want to receive notifications, reply to this comment with the word STOP

Vote for @Steemitboard as a witness to get one more award and increased upvotes!

Thank you for your continued support towards JJM. For each 1000 JJM you are holding, you can get an additional 1% of upvote. 10,000JJM would give you a 11% daily voting from the 700K SP virus707 account.

big-tree-3443533_960_720.jpg

아낌없이 주는 나무 후원으로 왔습니다:)

ldsklee님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
ldsklee님의 이벤트 당첨자 발표 및 이벤트 진행(당첨금 2sct)

...
yann03, feelsogood, rainingfall, dozam, mimistar, bluengel, anpigon strosalia, sesil, mistytruth, jun1004, kstop1, jstory님이 참여 해...

wonsama님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
wonsama님의 [wengine] 스팀엔진토큰 확인툴 - 기능 업그레이드

...pyberrysboy
  • 스팀툴즈 - 크롬웹스토어 / 스팀툴즈 - 메뉴얼
anpigon
  • 스팀잇 업보팅 계산기
jacobyu
  • JJM 홀더

    Hi @anpigon!

    Your post was upvoted by @steem-ua, new Steem dApp, using UserAuthority for algorithmic post curation!
    Your UA account score is currently 2.729 which ranks you at #13460 across all Steem accounts.
    Your rank has improved 129 places in the last three days (old rank 13589).

    In our last Algorithmic Curation Round, consisting of 146 contributions, your post is ranked at #106.

    Evaluation of your UA score:
    • Only a few people are following you, try to convince more people with good work.
    • The readers like your work!
    • You have already shown user engagement, try to improve it further.

    Feel free to join our @steem-ua Discord server

    wonsama님이 anpigon님을 멘션하셨습니당. 아래 링크를 누르시면 연결되용~ ^^
    wonsama님의 [whan] 개발중인 것 ... 스팀엔진 매수매도 알람

    ...pyberrysboy
    • 스팀툴즈 - 크롬웹스토어 / 스팀툴즈 - 메뉴얼
    anpigon
    • 스팀잇 업보팅 계산기
    jacobyu
    • JJM 홀더

      Coin Marketplace

      STEEM 0.19
      TRX 0.13
      JST 0.028
      BTC 66338.04
      ETH 3306.77
      USDT 1.00
      SBD 2.69