Post

[TIL] 삼성 시그니처: RSA 암호화는 연속 두번 진행할 수없다?!

ISSUE1. RSA 암호화의 길이제한

문제상황

  • 초반 시그니처 토큰을 암호화 하는 계획은 다음과 같았다.

Untitled

  • 삼성페이의 결제 로직
    • 카드사에서 발급한 고정화된 토큰을 트러스트존에 저장한다.
    • 그 다음, 사용자가 삼성페이를 이용해 결제를 시도하면 디바이스의 트러스트 존에 저장된 고정화 토큰을 카드사에 보낸다.
  • 삼성 시그니처 초기 암호화 계획
    • 그래서 우리는 카드사에서 발급한 고정화토큰을 하이브리드 암호화하여 사용자의 트러스트 존에 저장한다
      1. 고정화토큰을 대리결제 요청자의 공개키로 암호화
      2. 1에서 암호화한 토큰을 다시 스인자의 개인키로 암호화
      3. 제약조건과 2번까지 암호화한 토큰을 대칭키로 암호화하여 시그니처 토큰을 만든다.

하지만, 2번을 진행하려고하는 순간 IllegalBlockSizeException: Data must not be longer than 256 bytes

오류가 떴다….

이유는 뭘까?

  • 비대칭 암호화에는 데이터 크기 제한이 있다. RSA 2048을 사용했기 때문에 최대 데이터 크기는 약 256bytes이다.(패딩 길이 까지 합쳐서)
  • 고정화 토큰을 재연하기 위해 우리는 JWT를 사용하였다.
    • 이때 . 과 같은 문자는 Base64인코딩을 할 수없기에 urlEncoder를 사용해야한다.
  • Base64인코딩도 해야했기때문에 기존 길이보다 33%늘어날 것이다.
  • 그럼 초기 암호화 계획을 진행할 수 없다. 그럼 어떻게 해야할까?

해결방법

하이브리드 암호화 방식을 사용해보자!

  • 초기 암호화 계획의 2.3.순서를 조정해 보았다.
    1. 고정화 토큰을 대리결제 승인자의 개인키로 암호화
    2. 제약조건과 1번의 암호화 토큰을 객체로 만들어 string으로 역직렬화한다.
    3. 2번의 평문을 랜덤키를 생성하여 대칭키로 암호화한다.
    4. 랜덤키를 요청자의 공개키로 암호화
  • 일단 승인자와 요청자의 암호화 순서를 바꾸었는데 이 토큰은 요청자가 결제를 시도하면 복호화를 해야한다.
  • 그런데 대칭키를 승인자의 공개키로 암호화한다면?
    • 복호화는 승인자의 개인키로 해야한다.
  • 하지만 요청자와 서버는 승인자의 개인키를 알 수 없기 때문에 복호화 자체를 할 수 없다.
  • 그래서 랜덤키는 요청자의 공개키로 복호화하여 받는 사람이 요청자임을 확인하는 방식으로 변경하였다.

최종 시그니처 토큰 암호화방식

스크린샷 2024-05-26 오후 3 58 57

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.