Skip to content

Commit ea4ab34

Browse files
committed
fix encrypted rsa key issue
1 parent 372ac9c commit ea4ab34

File tree

5 files changed

+43
-29
lines changed

5 files changed

+43
-29
lines changed

pom.xml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212

1313
<groupId>com.snowflake</groupId>
1414
<artifactId>snowflake-kafka-connector</artifactId>
15-
<version>0.4.0</version>
15+
<version>0.5.0</version>
1616
<packaging>jar</packaging>
1717
<name>Snowflake Kafka Connector</name>
1818
<description>Snowflake Kafka Connect Sink Connector</description>
@@ -173,6 +173,7 @@
173173

174174
<plugin>
175175
<artifactId>maven-assembly-plugin</artifactId>
176+
<version>3.1.1</version>
176177
<executions>
177178
<execution>
178179
<phase>package</phase>
@@ -264,10 +265,15 @@
264265
<dependency>
265266
<groupId>org.bouncycastle</groupId>
266267
<artifactId>bcprov-ext-jdk15on</artifactId>
267-
<version>1.60</version>
268-
<scope>test</scope>
268+
<version>1.61</version>
269+
<scope>provided</scope>
270+
</dependency>
271+
<dependency>
272+
<groupId>org.bouncycastle</groupId>
273+
<artifactId>bcpkix-jdk15on</artifactId>
274+
<version>1.61</version>
275+
<scope>provided</scope>
269276
</dependency>
270-
271277

272278
<!-- https://mvnrepository.com/artifact/org.apache.kafka/connect-api -->
273279
<dependency>

src/main/java/com/snowflake/kafka/connector/Utils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public class Utils
3737
{
3838

3939
//Connector version, change every release
40-
static final String VERSION = "0.4.0";
40+
static final String VERSION = "0.5.0";
4141

4242
//connector parameter list
4343
public static final String NAME = "name";

src/main/java/com/snowflake/kafka/connector/internal/InternalUtils.java

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,20 @@
33
import com.snowflake.kafka.connector.Utils;
44
import net.snowflake.client.jdbc.internal.apache.commons.codec.binary.Base64;
55
import net.snowflake.ingest.connection.IngestStatus;
6+
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
7+
import org.bouncycastle.jce.provider.BouncyCastleProvider;
8+
import org.bouncycastle.openssl.PEMParser;
9+
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
10+
import org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder;
11+
import org.bouncycastle.operator.InputDecryptorProvider;
12+
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
613
import org.slf4j.Logger;
714
import org.slf4j.LoggerFactory;
815

9-
import javax.crypto.Cipher;
10-
import javax.crypto.EncryptedPrivateKeyInfo;
11-
import javax.crypto.SecretKeyFactory;
12-
import javax.crypto.spec.PBEKeySpec;
13-
import java.security.AlgorithmParameters;
14-
import java.security.Key;
16+
import java.io.StringReader;
1517
import java.security.KeyFactory;
1618
import java.security.PrivateKey;
17-
import java.security.spec.KeySpec;
19+
import java.security.Security;
1820
import java.security.spec.PKCS8EncodedKeySpec;
1921
import java.sql.ResultSet;
2022
import java.sql.SQLException;
@@ -86,22 +88,28 @@ static PrivateKey parseEncryptedPrivateKey(String key, String passphrase)
8688
key = key.replaceAll("-+[A-Za-z ]+-+", "");
8789
key = key.replaceAll("\\s", "");
8890

91+
StringBuilder builder = new StringBuilder();
92+
builder.append("-----BEGIN ENCRYPTED PRIVATE KEY-----");
93+
for (int i = 0; i < key.length(); i++)
94+
{
95+
if(i%64==0)
96+
{
97+
builder.append("\n");
98+
}
99+
builder.append(key.charAt(i));
100+
}
101+
builder.append("\n-----END ENCRYPTED PRIVATE KEY-----");
102+
key = builder.toString();
103+
Security.addProvider(new BouncyCastleProvider());
89104
try
90105
{
91-
byte[] code = Base64.decodeBase64(key);
92-
EncryptedPrivateKeyInfo encryptPKInfo =
93-
new EncryptedPrivateKeyInfo(code);
94-
95-
Cipher cipher = Cipher.getInstance(encryptPKInfo.getAlgName());
96-
PBEKeySpec pbeKeySpec = new PBEKeySpec(passphrase.toCharArray());
97-
SecretKeyFactory secretKeyFactory =
98-
SecretKeyFactory.getInstance(encryptPKInfo.getAlgName());
99-
Key pbeKey = secretKeyFactory.generateSecret(pbeKeySpec);
100-
AlgorithmParameters algorithmParameters = encryptPKInfo.getAlgParameters();
101-
cipher.init(Cipher.DECRYPT_MODE, pbeKey, algorithmParameters);
102-
KeySpec keySpec = encryptPKInfo.getKeySpec(cipher);
103-
KeyFactory kf = KeyFactory.getInstance("RSA");
104-
return kf.generatePrivate(keySpec);
106+
PEMParser pemParser = new PEMParser(new StringReader(key));
107+
PKCS8EncryptedPrivateKeyInfo encryptedPrivateKeyInfo = (PKCS8EncryptedPrivateKeyInfo) pemParser.readObject();
108+
pemParser.close();
109+
InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(passphrase.toCharArray());
110+
JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);
111+
PrivateKeyInfo decryptedPrivateKeyInfo = encryptedPrivateKeyInfo.decryptPrivateKeyInfo(pkcs8Prov);
112+
return converter.getPrivateKey(decryptedPrivateKeyInfo);
105113
}
106114
catch (Exception e)
107115
{
@@ -115,7 +123,7 @@ static PrivateKey parsePrivateKey(String key)
115123
key = key.replaceAll("-+[A-Za-z ]+-+", "");
116124
key = key.replaceAll("\\s", "");
117125

118-
java.security.Security.addProvider(new net.snowflake.client.jdbc.internal.org.bouncycastle.jce.provider.BouncyCastleProvider());
126+
java.security.Security.addProvider(new BouncyCastleProvider());
119127
byte[] encoded = Base64.decodeBase64(key);
120128
try
121129
{

src/main/java/com/snowflake/kafka/connector/records/RecordService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,8 @@ public String processRecord(SinkRecord record)
108108
}
109109

110110
//include String key
111-
if (record.keySchema().toString().equals(Schema.STRING_SCHEMA.toString()))
111+
if (record.keySchema().toString().equals(Schema.STRING_SCHEMA.toString())
112+
&& record.key() != null)
112113
{
113114
meta.put(KEY, record.key().toString());
114115
}

src/test/java/com/snowflake/kafka/connector/UtilsTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
import org.junit.Test;
66

77
import java.util.Map;
8-
import java.util.regex.Matcher;
98

109
public class UtilsTest
1110
{

0 commit comments

Comments
 (0)