개요
이번 테스트에서는 Go 언어와 nCipher HSM을 연동해, RSA 공개키로 메시지를 암호화하고, 개인키로 복호화하는 과정을 직접 구현해봤습니다.
이전 글에서 사용했던 RSA 키쌍(label: test2)을 그대로 사용하며, pkcs11 인터페이스를 통해 다음과 같은 흐름으로 작업을 진행합니다:
- 메시지 파일 생성
- 공개키로 암호화
- 개인키로 복호화 (HSM 내부 연산)
RSA 암복호화는 개인키가 절대로 외부로 노출되지 않아야 하는 보안 상황에서 매우 유용합니다. 특히 복호화는 반드시 HSM 내부에서 수행되어야 하며, 개인키는 HSM 장비 밖으로 가져올 수 없습니다.
테스트 메시지 준비
테스트에 사용할 평문 메시지를 생성합니다:
sudo bash -c 'echo "이건 RSA 암호화 테스트 메시지입니다." > message.txt'
생성된 message.txt는 뒤에서 암호화할 대상 파일이며, 테스트 완료 후 복호화 결과(decrypted.txt)와 동일해야 합니다.
🔐 참고: RSA는 짧은 길이의 데이터(수백 byte 이하)만 직접 암호화 가능합니다. 긴 데이터는 일반적으로 AES 대칭키로 암호화하고, 그 키를 RSA로 암호화하는 하이브리드 방식을 사용합니다.
공개키 암호화 (encrypt.go)
이전 테스트에서 추출한 test_pub.pem 공개키 파일을 사용해 메시지를 암호화합니다.
주요 처리 흐름:
- 공개키 PEM 파일(test_pub.pem) 로딩
- 메시지 파일(message.txt) 로딩
- RSA PKCS#1 v1.5 방식으로 암호화
- 암호문(enc_data.bin)으로 저장
// 공개키 로딩
pubBytes, _ := ioutil.ReadFile("test_pub.pem")
block, _ := pem.Decode(pubBytes)
rsaPub, _ := x509.ParsePKIXPublicKey(block.Bytes)
// 암호화 및 저장
enc, _ := rsa.EncryptPKCS1v15(rand.Reader, rsaPub.(*rsa.PublicKey), msg)
os.WriteFile("enc_data.bin", enc, 0644)
Go 표준 라이브러리 crypto/rsa 패키지를 활용해 암호화를 수행합니다. 이 라이브러리는 공개키 암호화를 위한 EncryptPKCS1v15 함수를 제공하며, 보안적으로 안전한 랜덤 소스를 사용합니다.
공개키는 누구나 접근 가능하기 때문에, 메시지를 암호화하는 작업은 HSM 없이도 수행할 수 있습니다.
HSM 복호화 (decrypt.go)
복호화는 반드시 HSM 내부에서 수행되어야 하며, 개인키는 장비 외부로 절대 추출되지 않습니다. Go에서 miekg/pkcs11 라이브러리를 사용하여 HSM과 통신합니다.
- nCipher PKCS#11 모듈 초기화
- label이 test2인 RSA 개인키 검색
- 암호문 로딩
- CKM_RSA_PKCS 메커니즘으로 복호화
- 결과를 decrypted.txt에 저장
// 개인키 객체 찾기
template := []*pkcs11.Attribute{
pkcs11.NewAttribute(pkcs11.CKA_LABEL, "test2"),
pkcs11.NewAttribute(pkcs11.CKA_CLASS, pkcs11.CKO_PRIVATE_KEY),
}
p.FindObjectsInit(session, template)
objs, _, _ := p.FindObjects(session, 1)
// 복호화 수행
p.DecryptInit(session, []*pkcs11.Mechanism{
pkcs11.NewMechanism(pkcs11.CKM_RSA_PKCS, nil),
}, objs[0])
dec, _ := p.Decrypt(session, enc)
os.WriteFile("decrypted.txt", dec, 0644)
복호화 연산은 HSM 내부에서만 실행되며, 외부에서는 복호화할 수 없습니다.
결과 확인
정상적으로 암호화와 복호화가 수행되었다면, 다음과 같은 출력이 나타납니다:
공개키 암호화 완료 → enc_data.bin
HSM 복호화 완료 → decrypted.txt
복호화된 파일 확인:
cat decrypted.txt
# 출력: 이건 RSA 암호화 테스트 메시지입니다.
정리 및 결론
| 항목 | 설명 |
| 키 생성 | 기존 RSA 키쌍(test2) 사용 |
| 암호화 | 공개키로 메시지를 암호화 (Go crypto/rsa) |
| 복호화 | HSM 내부의 개인키로만 복호화 수행 |
| 보안성 | 개인키는 절대 외부로 추출되지 않음 |
이번 테스트를 통해, HSM의 비밀키 보호 특성과 Go 언어로 암복호화 전 과정을 자동화할 수 있는 능력을 확인할 수 있었습니다. 금융, 인증 시스템 등 민감한 정보 보호가 필요한 분야에서 강력한 보안 방안을 적용할 수 있습니다.
'개발 > Golang' 카테고리의 다른 글
| [go] golang으로 hsm 연동 및 RSA 키 생성부터 서명 검증 (1) | 2025.07.24 |
|---|---|
| [go] 월간 인프라 정기점검 리포트 golang 자동화 (0) | 2025.06.04 |

