728x90
반응형
SMALL

안녕하세요 오랜만에 뵙겠습니다.
그동안 까먹은건 아니고 명절과 각종 일들이 많아지면서 포스팅을 약 2주간 쉬었는데
이번주부더 다시 꾸준하게 포스팅 시작해보려고 합니다.
이번에 포스팅할 주제는 제가 주로 다루고있는 '보안'에 관련된 주제 입니다.
보안 회사를 다니면서 타 주제보다 보안에 더 잘 앎에도 불구하고 자주 포스팅 안한거 같아
이렇게 포스팅을 해보려 합니다.
고로 보안 회사 관점에서 브라우저/웹 서비스에서 RSA를 안전하게 쓰는 법을 3편으로 정리해보겠습니다.
포스팅 순서는 쉬운 도입 → 실전 코드 → 심화·운영 보안 순서로 구성하였고
가능하면 Web Crypto API(표준) 를 우선 사용하겠습니다.
참고로 “rsa.js” 같은 순수 JS 구현은 학습용으로만 참고하고, 실서비스에서는 표준 API/검증된 라이브러리를 권장드립니다.
서론이 특이하게 길었는데 그만하고 시작하겠습니다.
왜 RSA를 쓰나요?
- 키 분리: 공개키로 암호화/검증, 개인키로 복호화/서명입니다. 키를 나누면 배포/권한 분리가 쉬워집니다.
- 주요 용도: 작은 데이터 암호화(주로 세션키 암호화), 전자서명, 키 교환입니다. 실제 대용량 데이터는 대칭키(AES) 로 처리하는 하이브리드 방식이 표준입니다.
반드시 알아둘 보안 포인트
- 패딩: 암호화는 RSA-OAEP, 서명은 RSASSA-PSS 권장입니다. (PKCS#1 v1.5는 호환용에 한정)
- 키 길이: 실무 권장 최소 2048-bit, 가능하면 3072-bit 이상입니다.
- 난수: 브라우저/Node의 CSPRNG 사용이 기본입니다.
- 직접 구현 금지: rsa.js 같은 수제 구현은 학습용으로만 보시고, 실무는 Web Crypto API, 서버는 BouncyCastle/openssl 등 검증 스택을 쓰겠습니다.
브라우저에서 공개키로 암호화 (RSA-OAEP)
// 변경점: 표준 Web Crypto API 사용, RSA-OAEP로 공개키 가져오기/암호화입니다.
async function importPublicKey(pem) {
const b64 = pem.replace(/-----(BEGIN|END) PUBLIC KEY-----/g, "").replace(/\s+/g, "");
const der = Uint8Array.from(atob(b64), c => c.charCodeAt(0));
return crypto.subtle.importKey(
"spki", der.buffer,
{ name: "RSA-OAEP", hash: "SHA-256" },
false, ["encrypt"]
);
}
async function encryptWithRsaOaep(publicPem, dataUtf8) {
const key = await importPublicKey(publicPem);
const enc = new TextEncoder().encode(dataUtf8);
const ct = await crypto.subtle.encrypt({ name: "RSA-OAEP" }, key, enc);
return btoa(String.fromCharCode(...new Uint8Array(ct))); // 전송용 Base64
}
키 포맷 변경점: 브라우저는 SPKI(공개키)/PKCS#8(개인키) DER 바이너리를 importKey로 받습니다. PEM→DER 변환만 해주면 호환됩니다.
왜 “하이브리드”가 기본일까요?
- RSA는 블록 제약과 성능 한계가 있어 소량 데이터에 적합합니다.
- 안전한 패턴은 AES-GCM(본문) + RSA-OAEP(세션키) 입니다. 이것은 2편에서 코드를 이어가겠습니다.
고로 이번편을 한줄로 요약하자면
RSA는 “작은 것만”, 패딩은 OAEP/PSS, 실전은 하이브리드가 정답입니다.
이상 포스팅을 마치고 2편에서 뵙겠습니다
728x90
반응형
LIST
'TIPS' 카테고리의 다른 글
| 심화·운영 보안: 키 관리, 키 회전, 성능·취약점, 감사·테스트 part.3 (3/3) (0) | 2025.11.10 |
|---|---|
| 실전: 브라우저-서버 하이브리드 암호화 & 서명 (Java 연동) part.2 (2/3) (0) | 2025.11.03 |
| 인공지능의 기초 원리부터 고급까지 part.4 (4/4) (0) | 2025.09.29 |
| 인공지능의 기초 원리부터 고급까지 part.3 (3/4) (0) | 2025.09.22 |
| 인공지능의 기초 원리부터 고급까지 part.2 (2/4) (0) | 2025.09.15 |