f3c2e64191
RsaPssVerifier 추가 - RsaPssSigner: spring-security-jwt Signer 구현, RSASSA-PSS(SHA-256/MGF1/salt=32) 서명 - RsaPssVerifier: SignatureVerifier 구현, 동일 PSS 파라미터로 검증 - PssJwtAccessTokenConverter: JwtHelper를 우회하여 PS256 JWT 직접 발급·검증 - encode/decode 오버라이드로 JwtAlgorithms PS256 미등록 문제 해결 - 생성자에서 공개키 PEM을 보관하여 getKey() 엔드포인트 대응 - build.gradle: spring-security-jwt:1.1.1.RELEASE api 의존성 추가 - RsaPssSignerVerifierTest: 단위테스트 13개 (서명/검증/라운드트립/시각확인)
48 lines
1.5 KiB
Java
48 lines
1.5 KiB
Java
package com.eactive.eai.authserver.jwt;
|
|
|
|
import java.security.Signature;
|
|
import java.security.interfaces.RSAPublicKey;
|
|
import java.security.spec.MGF1ParameterSpec;
|
|
import java.security.spec.PSSParameterSpec;
|
|
|
|
import org.springframework.security.jwt.crypto.sign.InvalidSignatureException;
|
|
import org.springframework.security.jwt.crypto.sign.SignatureVerifier;
|
|
|
|
/**
|
|
* PS256 (RSA-PSS + SHA-256) 서명 검증 구현체.
|
|
* RFC 7518 §3.5 파라미터: Hash=SHA-256, MGF=MGF1/SHA-256, saltLen=32, trailer=0xBC
|
|
*/
|
|
public class RsaPssVerifier implements SignatureVerifier {
|
|
|
|
private static final PSSParameterSpec PSS_SPEC =
|
|
new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 32, 1);
|
|
|
|
private final RSAPublicKey publicKey;
|
|
|
|
public RsaPssVerifier(RSAPublicKey publicKey) {
|
|
this.publicKey = publicKey;
|
|
}
|
|
|
|
@Override
|
|
public void verify(byte[] content, byte[] signature) {
|
|
try {
|
|
Signature sig = Signature.getInstance("RSASSA-PSS");
|
|
sig.setParameter(PSS_SPEC);
|
|
sig.initVerify(publicKey);
|
|
sig.update(content);
|
|
if (!sig.verify(signature)) {
|
|
throw new InvalidSignatureException("RSA-PSS 서명 검증 실패");
|
|
}
|
|
} catch (InvalidSignatureException e) {
|
|
throw e;
|
|
} catch (Exception e) {
|
|
throw new InvalidSignatureException("RSA-PSS 서명 검증 실패: " + e.getMessage());
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public String algorithm() {
|
|
return "PS256";
|
|
}
|
|
}
|