'2025/02/21'에 해당되는 글 1건

728x90

JMeter 에서 RSA 암호화 로그인 방법을 찾으려고 개고생을 했다.

구글링으로 원하는 답을 구하지 못했고 chatGPT도 엉터리 답변 때문에 수많은 시간을 낭비했다.

Javascript 에서 jsencrypt.min.js 라이브러리를 활용하여 RSA 암호화를 하기 때문에 이 코드 찾는 방법에 수많은 시간을 허비 했던 것이 가장 큰 오류중의 하나였다.

이기종 언어간에 RSA 암호화/복호화 가능하기 때문에 Java에서 제공하는 RSA 암호화 로직을 활용하면 된다.

 

자세한 설명은 생략하고 이미지 순서에 따라 처리하면 된다.

처음에는 로그인이 성공하는지 확인하기 위한 목적이니 2번과 같이 1회로 한정한다.

 

공개키 추출하는 방법

- 공개키를 JSON 으로 반환하도록 처리해야 한다.

 

 

JSON 으로 제공된 pub_key 를 추출하여 pubkey 변수에 저장하기 위한 목적이다.

가장 크게 삽질한 것은 JSR223 PreProcessor 부분이다. 바로 변수로 저장할 수 있는 줄 알고 했는데 ㅠㅠㅠ

 

 

변수를 저장하기 위해서 HTTP Request 를 추가하고 pubkey 변수를 입력받도록 파라미터를 아래와 같이 지정한다.

 

 

 

 

21번 항목의 코드 내용이다.

아래 코드에서 vars.get("pubkey") 의 pubkey 가 입력변수이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import java.security.KeyFactory
import java.security.spec.X509EncodedKeySpec
import java.security.PublicKey
import javax.crypto.Cipher
import org.apache.commons.codec.binary.Base64
 
// JSON Extractor에서 추출한 공개 키 가져오기
String publicKeyString = vars.get("pubkey");
 
// Debugging: JMeter log에서 확인 가능
log.info("Extracted Public Key: " + publicKeyString);
 
if (publicKeyString == null || publicKeyString.equals("NOT_FOUND"|| publicKeyString.isEmpty()) {
    throw new RuntimeException("Public Key not found in response! Check JSON Extractor.");
}
 
// 암호화할 비밀번호 가져오기
String password = vars.get("password");
 
// 공개 키 복원
byte[] keyBytes = Base64.decodeBase64(publicKeyString);
X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(spec);
 
// RSA 암호화 수행
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] encryptedBytes = cipher.doFinal(password.getBytes("UTF-8"));
 
// Base64로 인코딩
String encryptedPassword = Base64.encodeBase64String(encryptedBytes);
 
// JMeter 변수 저장
vars.put("encryptedPassword", encryptedPassword);
log.info("Encrypted Password: " + encryptedPassword);
 

Java 에서의 RSA 암호화가 다른 언어에서 복호화가 가능하다.

Javascript 에서는 jsencrypt.min.js 라이브러리를 활용하여 RSA 암호화가 가능하다.

하지만 JMeter 에서는 javascript 암호화를 지원하지 않기 때문에 Java RSA 암호화를 활용하는 것이다.

 

vars.put(" encryptedPassword ") 가 아래 그림에서 패스워드 입력값이다.

 

나머지 사항은 이전 게시글 내용과 이미지를 참조하면 된다.

RSA 암호화 시 KEY 쌍이 실시간으로 변경되는 경우에 대한 처리는 아직 테스트하지 못했다. → 테스트 성공했다. 이 경우는 다른 게시글에서 올리겠다.

RSA 암호화/복호화 시 사용할 KEY 쌍이 일정시간동안 변경되지 않는 방식인 경우를 테스트 후 성공했다.

 

 

 

 

 

chatGPT 에게 제대로 된 답변을 알려줬다.

728x90
블로그 이미지

Link2Me

,