Skip to content

Commit 9de4858

Browse files
authored
Merge pull request #1 from toss/algorithm-change
RSA 알고리즘 변경 / GCM iv 길이 변경(128->96bit)
2 parents f71d5e4 + 5d97e3b commit 9de4858

File tree

6 files changed

+17
-50
lines changed

6 files changed

+17
-50
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ JAVA 1.8버전 사용자들을 위한 세션키 발급 및 개인정보 암복
66

77
예시)
88
```
9-
<version>0.0.2</version>
9+
<version>0.0.3</version>
1010
```
1111

1212
pom.xml 을 사용하시면 아래와 같이 추가해주세요.

build.gradle

+2-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ plugins {
66
}
77

88
group 'com.github.toss'
9-
version '0.0.2'
9+
version '0.0.3'
1010

1111
sourceCompatibility = JavaVersion.VERSION_1_7
1212
targetCompatibility = JavaVersion.VERSION_1_7
@@ -18,6 +18,7 @@ shadowJar {
1818
}
1919

2020
repositories {
21+
mavenLocal()
2122
mavenCentral()
2223
maven { url = uri("https://jitpack.io") }
2324
}

src/main/java/im/toss/cert/sdk/RSACipher.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ static private PublicKey getPublicKeyFromBase64Encrypted(String base64PublicKey)
2828
String encrypt(String plainText)
2929
throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException,
3030
BadPaddingException, IllegalBlockSizeException {
31-
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
31+
Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
3232
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
3333

3434
byte[] bytePlain = cipher.doFinal(plainText.getBytes());

src/main/java/im/toss/cert/sdk/SecureKeyGenerator.java

+6
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,10 @@ static String generateKey(int aesKeyBitLength) throws NoSuchAlgorithmException {
1010
keyGenerator.init(aesKeyBitLength, new SecureRandom());
1111
return Base64Utils.encodeToString(keyGenerator.generateKey().getEncoded());
1212
}
13+
14+
static String generateRandomBytes(int lengthInBits) {
15+
byte[] bytes = new byte[lengthInBits / 8];
16+
new SecureRandom().nextBytes(bytes);
17+
return Base64Utils.encodeToString(bytes);
18+
}
1319
}

src/main/java/im/toss/cert/sdk/TossCertSessionGenerator.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,12 @@ public TossCertSession generate(AESAlgorithm algorithm) {
3333
try {
3434
String id = UUID.randomUUID().toString();
3535
String secretKey = SecureKeyGenerator.generateKey(256);
36-
String iv = SecureKeyGenerator.generateKey(128);
36+
String iv;
37+
if (algorithm == AESAlgorithm.AES_GCM) {
38+
iv = SecureKeyGenerator.generateRandomBytes(96);
39+
} else {
40+
iv = SecureKeyGenerator.generateKey(128);
41+
}
3742
String encryptedSessionKey = buildEncryptSessionKeyPart(algorithm, secretKey, iv);
3843
return new TossCertSession(version, id, algorithm, secretKey, iv, encryptedSessionKey);
3944
} catch (Exception e) {

src/test/java/im/toss/cert/sdk/TossCertSessionTest.java

+1-46
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public void test() {
1919

2020
// 4. 요청 파라미터에 추가해주세요.
2121
String sessionKey = tossCertSession.getSessionKey();
22+
System.out.println("sessionKey: " + sessionKey);
2223
// String userName = encryptedUserName;
2324

2425
// 5. 응답을 받은 경우, 요청을 보낼 때 생성했던 tossCertSession 을 가지고 있어야 합니다.
@@ -30,50 +31,4 @@ public void test() {
3031

3132
Assertions.assertEquals(decryptedUserName, userName);
3233
}
33-
34-
@Test
35-
public void cbcTest() {
36-
// 1. 세션 생성기를 사전에 생성해 주세요.
37-
TossCertSessionGenerator tossCertSessionGenerator = new TossCertSessionGenerator();
38-
39-
// 2. 인증 요청(개인정보가 포함된 경우) API 호출 전에, 세션을 생성해 주세요.
40-
TossCertSession tossCertSession = tossCertSessionGenerator.generate(AESAlgorithm.AES_CBC);
41-
42-
// 3. 개인정보를 암호화 해주세요.
43-
String userName = "소중한 개인정보 입니다";
44-
String encryptedUserName = tossCertSession.encrypt(userName);
45-
System.out.println("encryptedUserName: " + encryptedUserName);
46-
47-
// 4. 요청 파라미터에 추가해주세요.
48-
String sessionKey = tossCertSession.getSessionKey();
49-
// String userName = encryptedUserName;
50-
51-
// 5. 응답을 받은 경우, 요청을 보낼 때 생성했던 tossCertSession 을 가지고 있어야 합니다.
52-
// encryptedUserName 가 응답을 받은 암호화된 userName 이라고 가정합니다.
53-
String decryptedUserName = tossCertSession.decrypt(encryptedUserName);
54-
55-
// 6. decryptedUserName 은 무결성 검증까지 완료되어 있습니다.
56-
System.out.println("decryptedUserName: " + decryptedUserName);
57-
58-
Assertions.assertEquals(decryptedUserName, userName);
59-
}
60-
61-
@Test
62-
public void deserializeTest() {
63-
// 1. 세션 생성기를 사전에 생성해 주세요.
64-
TossCertSessionGenerator tossCertSessionGenerator = new TossCertSessionGenerator();
65-
66-
TossCertSession tossCertSession = tossCertSessionGenerator.generate();
67-
68-
// 2. DB 혹은 다른 저장소에 저장이 필요한 경우, serialize 를 이용해주세요(민감한 정보이므로 저장시 추가 암호화를 해주세요!!).
69-
String serialized = tossCertSession.serializeSession();
70-
71-
// 3. deserialize
72-
TossCertSession deserializedTossCertSession = tossCertSessionGenerator.deserialize(serialized);
73-
74-
// 검증
75-
String plainText = "검증용 문자열";
76-
String encryptedText = tossCertSession.encrypt(plainText);
77-
Assertions.assertEquals(tossCertSession.decrypt(encryptedText), deserializedTossCertSession.decrypt(encryptedText));
78-
}
7934
}

0 commit comments

Comments
 (0)