[TIL] 삼성 시그니처: RSA 암호화는 연속 두번 진행할 수없다?!
ISSUE1. RSA 암호화의 길이제한
❓문제상황
- 초반 시그니처 토큰을 암호화 하는 계획은 다음과 같았다.
- 삼성페이의 결제 로직
- 카드사에서 발급한 고정화된 토큰을 트러스트존에 저장한다.
- 그 다음, 사용자가 삼성페이를 이용해 결제를 시도하면 디바이스의 트러스트 존에 저장된 고정화 토큰을 카드사에 보낸다.
- 삼성 시그니처 초기 암호화 계획
- 그래서 우리는 카드사에서 발급한 고정화토큰을 하이브리드 암호화하여 사용자의 트러스트 존에 저장한다
- 고정화토큰을 대리결제 요청자의 공개키로 암호화
- 1에서 암호화한 토큰을 다시 스인자의 개인키로 암호화
- 제약조건과 2번까지 암호화한 토큰을 대칭키로 암호화하여 시그니처 토큰을 만든다.
- 그래서 우리는 카드사에서 발급한 고정화토큰을 하이브리드 암호화하여 사용자의 트러스트 존에 저장한다
하지만, 2번을 진행하려고하는 순간 IllegalBlockSizeException: Data must not be longer than 256 bytes
오류가 떴다….
이유는 뭘까?
- 비대칭 암호화에는 데이터 크기 제한이 있다. RSA 2048을 사용했기 때문에 최대 데이터 크기는 약 256bytes이다.(패딩 길이 까지 합쳐서)
- 고정화 토큰을 재연하기 위해 우리는 JWT를 사용하였다.
- 이때
.
과 같은 문자는 Base64인코딩을 할 수없기에 urlEncoder를 사용해야한다.
- 이때
- Base64인코딩도 해야했기때문에 기존 길이보다 33%늘어날 것이다.
- 그럼 초기 암호화 계획을 진행할 수 없다. 그럼 어떻게 해야할까?
❗해결방법
하이브리드 암호화 방식을 사용해보자!
- 초기 암호화 계획의 2.3.순서를 조정해 보았다.
- 고정화 토큰을 대리결제 승인자의 개인키로 암호화
- 제약조건과 1번의 암호화 토큰을 객체로 만들어 string으로 역직렬화한다.
- 2번의 평문을 랜덤키를 생성하여 대칭키로 암호화한다.
- 랜덤키를 요청자의 공개키로 암호화
- 일단 승인자와 요청자의 암호화 순서를 바꾸었는데 이 토큰은 요청자가 결제를 시도하면 복호화를 해야한다.
- 그런데 대칭키를 승인자의 공개키로 암호화한다면?
- 복호화는 승인자의 개인키로 해야한다.
- 하지만 요청자와 서버는 승인자의 개인키를 알 수 없기 때문에 복호화 자체를 할 수 없다.
- 그래서 랜덤키는 요청자의 공개키로 복호화하여 받는 사람이 요청자임을 확인하는 방식으로 변경하였다.
최종 시그니처 토큰 암호화방식
This post is licensed under CC BY 4.0 by the author.
Comments powered by Disqus.