From 16eb7cc1075856496b5946c91b1174b9c1ca6f5e Mon Sep 17 00:00:00 2001 From: luren <879893931@qq.com> Date: Tue, 8 Dec 2020 18:54:37 +0800 Subject: [PATCH] !419 fix the design of security key feature * fix the design of security key feature. use public key to encrypt and private key to decrypt --- .../images/password-encryption-principal.PNG | Bin 21772 -> 14321 bytes hetu-docs/en/security/password-encryption.md | 178 ++++++++++------- .../images/password-encryption-principal.PNG | Bin 21772 -> 0 bytes .../images/password-encryption-principal.png | Bin 0 -> 14321 bytes hetu-docs/zh/security/password-encryption.md | 181 +++++++++++------- .../prestosql/catalog/CatalogStoreUtil.java | 2 +- .../security/KeystoreSecurityKeyManager.java | 27 +-- .../security/PasswordSecurityConfig.java | 2 +- .../security/RsaCipherTextDecrypt.java | 16 +- .../catalog/TestPasswordDecryption.java | 8 +- 10 files changed, 238 insertions(+), 176 deletions(-) mode change 100644 => 100755 hetu-docs/en/images/password-encryption-principal.PNG mode change 100644 => 100755 hetu-docs/en/security/password-encryption.md delete mode 100644 hetu-docs/zh/images/password-encryption-principal.PNG create mode 100755 hetu-docs/zh/images/password-encryption-principal.png mode change 100644 => 100755 hetu-docs/zh/security/password-encryption.md diff --git a/hetu-docs/en/images/password-encryption-principal.PNG b/hetu-docs/en/images/password-encryption-principal.PNG old mode 100644 new mode 100755 index 13100bce8fb117cdd41f7f4738e311f3ed08e831..f1bf513800731f3c196d7419e0ef40fca0b8af02 GIT binary patch literal 14321 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 V*MXP`c)TQc)F0f+SAF*CzX6(y7#IKm literal 21772 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 V*MXP`c)TQc)F0f+SAF*CzX6(y7#IKm literal 0 HcmV?d00001 diff --git a/hetu-docs/zh/security/password-encryption.md b/hetu-docs/zh/security/password-encryption.md old mode 100644 new mode 100755 index 0a2cdec12..4fca3bc7e --- a/hetu-docs/zh/security/password-encryption.md +++ b/hetu-docs/zh/security/password-encryption.md @@ -1,73 +1,110 @@ - -密码加密 -=================== - -概要 -------------------------- -openLooKeng 管理一些catalog相关的配置文件,这些配置文件可能包含一些用户名、密码等信息,其中,密码信息一般情况下要求保密,不能以明文的方式存储。 -这是一个典型的MySQL connector的配置文件: -``` -connector.name=mysql -connection-url=jdbc:mysql://localhost:3306 -connection-user=root -connection-password=123456 -``` -openLooKeng 可以开启密码加密功能,这些密码就可以被加密存储。 - -建议RSA Key的长度为3072 bit,最低2048 bit。 - -原理 -------------------------- -我们采用非对称加密算法 (RSA),原理如下: - -![password-encryption-principle](../images/password-encryption-principal.PNG) - -* 私钥: 用于加密,客户端使用私钥对明文进行加密。 -* 公钥: 用户解密,服务端将公钥存储在[文件系统](../develop/filesystem.md )的keystore中,并使用公钥对密文进行解密。 - -用户自己保存秘钥,将公钥给openLooKeng用于加密后的密文解密。 - -配置 -------------------------- - -为了开启密码加密特性,你需要在 `etc/config.properties`增加以下属性: -``` -security.password.decryption-type=RSA -security.key.manager-type=keystore -security.key.keystore-password=my-keystore-pwd -security.key.store-file-path=/openlookeng/keystore/keystore.jks -``` - -| 属性 | 描述 | -| :-------------------------------- | :----------------------------------------------------------- | -| `security.password.decryption-type` | 密码加解密使用的加密算法. 必须是 `NONE` 或 `RSA`. | -| `security.key.manager-type=keystore` | 加密秘钥的存储方式. 必须是 `keystore`. | -| `security.key.keystore-password` | keystore的密码. | -| `security.key.store-file-path` | [文件系统](../develop/filesystem.md) 中keystore文件的路径. | - -用例 -------------------------- -### 用例 1. 动态目录 -一个http请求的模板如下 (以MySQL connector为例): -``` -request: POST/PUT -header: 'X-Presto-User: admin' -form: ' - catalogInformation={ - "catalogName":"mysql", - "connectorName":"mysql", - "securityKey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1Z4yap2cI1u6zg/R8vTcltOy8xxeOt/VG0xEArud+c5rI9h2kWy8Uo7hTFN/JapVDENT17fEzd+SqrlvcmD8ceDH07+OW2RRGcQjR0GKpKGSmubEHdH01xzpuQ1+m83B84Ir5eqcWx6QIwBPQsqqjeNpHhYdJLMpSrX1V+c7UUQIDAQAB", - "properties":{ - "connection-url":"jdbc:mysql://localhost:3306", - "connection-user":"root", - "connection-password":"iRSxl1KNY06d34JGLooey0re4akzr+iJlTz1eCK1hEq8aYaX1SlzANCF7KTq6o2cF71OjINGvNjR0DXRed6gu3QYODw1Src0wiY0OvO9xfcffVt2rFvM/o238MJz1yhIcPn1BrrEgW5qVjzbbvzkS/fX+pTDqKNGAd3qefDLCuc=", - "encrypted-properties":"connection-password", - } - } -' -``` -* `securityKey`: 公钥. -* `connection-password`: 使用私钥加密后的密码密文. -* `encrypted-properties`: 加密的属性名称. - + +密码加密 +=================== + +概要 +------------------------- +openLooKeng 管理一些catalog相关的配置文件,这些配置文件可能包含一些用户名、密码等信息,其中,密码信息一般情况下要求保密,不能以明文的方式存储。 +这是一个典型的MySQL connector的配置文件: +``` +connector.name=mysql +connection-url=jdbc:mysql://localhost:3306 +connection-user=root +connection-password=123456 +``` +openLooKeng 可以开启密码加密功能,这些密码就可以被加密存储。 + +建议RSA Key的长度为3072 bit,最低2048 bit。 + +原理 +------------------------- +我们采用非对称加密算法 (RSA),原理如下: + +![password-encryption-principle](../images/password-encryption-principal.png) + +* 公钥: 用于加密,客户端使用公钥对明文进行加密。 +* 私钥: 用户解密,服务端将私钥存储在[文件系统](../develop/filesystem.md )的keystore中,并使用私钥对密文进行解密。 + +用户自己保存公钥,将私钥给openLooKeng用于加密后的密文解密。 + +配置 +------------------------- + +为了开启密码加密特性,你需要在 `etc/config.properties`增加以下属性: +``` +security.password.decryption-type=RSA +security.key.manager-type=keystore +security.key.keystore-password=my-keystore-pwd +security.key.store-file-path=/openlookeng/keystore/keystore.jks +``` + +| 属性 | 描述 | +| :-------------------------------- | :----------------------------------------------------------- | +| `security.password.decryption-type` | 密码加解密使用的加密算法. 必须是 `NONE` 或 `RSA`. | +| `security.key.manager-type=keystore` | 加密秘钥的存储方式. 必须是 `keystore`. | +| `security.key.keystore-password` | keystore的密码. | +| `security.key.cipher-transformations` | Cipher.getInstance(transformations), the default value is 'RSA/ECB/OAEPWITHSHA256AndMGF1Padding' | +| `security.key.store-file-path` | [文件系统](../develop/filesystem.md) 中keystore文件的路径. | + +用例 +------------------------- +### 用例 1. 公私钥 + +采用keytool工具生产一个keystore文件,从keystore文件中提取公钥,通过openssl工具使用提取的公钥加密需要加密的明文。 +同时,从keystore中提取私钥,并通过restful api发送给openLooKeng服务。 + +以下是使用样例: +``` +1. 采用pkcs12格式创建keystore: +keytool -genkeypair -alias alias -dname cn=openlookeng -validity 365 -keyalg RSA -keysize 2048 -keypass openlookeng -storetype jks -keystore keystore.jks -storepass openlookeng -deststoretype pkcs12 + +2. 从keystore中提取公钥,并将公钥复制到pub.key文件中: +keytool -list -rfc -keystore keystore.jks -storepass openlookeng | openssl x509 -inform pem -pubkey + +3. openssl工具加密,data.txt为需要加密的内容,result.en为加密结果,pub.key为公钥: +openssl pkeyutl -encrypt -in data.txt -out result.en -pubin -inkey pub.key -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:SHA256 -pkeyopt rsa_mgf1_md:SHA256 + +4. result.en需要采用base64转换为可读字符串: +cat result.en | base64 + +注意: 获取到可读密文字符串后,需要手动删除每行的换行符'\n' 。 + +5. 提取私钥 +keytool -v -importkeystore -srckeystore keystore.jks -srcstoretype jks -srcstorepass openlookeng -destkeystore server.pfx -deststoretype pkcs12 -deststorepass openlookeng -destkeypass openlookeng +openssl pkcs12 -in server.pfx -nocerts -nodes -out private.key + +private.key的文件内容就是提取的私钥. + +6. 添加静态数据源的私钥到keystore.jks (keystore.jks为security.key.store-file-path指定路径的文件) +假设静态数据源的名字是mysql001,静态数据源加密用的公钥是从keystore001.jks文件中提取的,需要主要的keystore.jks文件的alias必须跟静态数据源的名称一致,即为mysql001。因此,需要将keystore001.jks文件中alias为mysql001的私钥存储到keystore.jks文件中。 +可以参照以下命令实现: +keytool -v -importkeystore -srckeystore keystore001.jks -srcstoretype jks -srcstorepass openlookeng -destkeystore server.p12 -deststoretype pkcs12 -deststorepass openlookeng -destkeypass openlookeng +keytool -importkeystore -deststorepass openlookeng -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype pkcs12 -srcstorepass openlookeng -alias mysql001 + +``` + + +### 用例 2. 动态目录 +一个http请求的模板如下 (以MySQL connector为例): +``` +request: POST/PUT +header: 'X-Presto-User: admin' +form: ' + catalogInformation={ + "catalogName":"mysql", + "connectorName":"mysql", + "securityKey":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC1Z4yap2cI1u6zg/R8vTcltOy8xxeOt/VG0xEArud+c5rI9h2kWy8Uo7hTFN/JapVDENT17fEzd+SqrlvcmD8ceDH07+OW2RRGcQjR0GKpKGSmubEHdH01xzpuQ1+m83B84Ir5eqcWx6QIwBPQsqqjeNpHhYdJLMpSrX1V+c7UUQIDAQAB", + "properties":{ + "connection-url":"jdbc:mysql://localhost:3306", + "connection-user":"root", + "connection-password":"iRSxl1KNY06d34JGLooey0re4akzr+iJlTz1eCK1hEq8aYaX1SlzANCF7KTq6o2cF71OjINGvNjR0DXRed6gu3QYODw1Src0wiY0OvO9xfcffVt2rFvM/o238MJz1yhIcPn1BrrEgW5qVjzbbvzkS/fX+pTDqKNGAd3qefDLCuc=", + "encrypted-properties":"connection-password", + } + } +' +``` +* `securityKey`: 私钥. +* `connection-password`: 使用私钥加密后的密码密文. +* `encrypted-properties`: 加密的属性名称. + 可以从 [动态目录](../admin/dynamic-catalog.md) 查看更多信息. \ No newline at end of file diff --git a/presto-main/src/main/java/io/prestosql/catalog/CatalogStoreUtil.java b/presto-main/src/main/java/io/prestosql/catalog/CatalogStoreUtil.java index 924780e9a..352c6220d 100644 --- a/presto-main/src/main/java/io/prestosql/catalog/CatalogStoreUtil.java +++ b/presto-main/src/main/java/io/prestosql/catalog/CatalogStoreUtil.java @@ -63,7 +63,7 @@ public class CatalogStoreUtil String cipherText = properties.get(propertyName); if (cipherText != null) { String plainText = cipherTextDecryptUtil.decrypt(decryptKeyName, cipherText); - properties.put(propertyName, plainText); + properties.put(propertyName, plainText.replaceAll("\n", "")); } }); } diff --git a/presto-main/src/main/java/io/prestosql/security/KeystoreSecurityKeyManager.java b/presto-main/src/main/java/io/prestosql/security/KeystoreSecurityKeyManager.java index 38b3ae007..99f2afbe1 100644 --- a/presto-main/src/main/java/io/prestosql/security/KeystoreSecurityKeyManager.java +++ b/presto-main/src/main/java/io/prestosql/security/KeystoreSecurityKeyManager.java @@ -37,11 +37,9 @@ import java.security.Key; import java.security.KeyStore; import java.security.KeyStoreException; import java.security.NoSuchAlgorithmException; -import java.security.PrivateKey; -import java.security.PublicKey; import java.security.UnrecoverableKeyException; -import java.security.cert.Certificate; import java.security.cert.CertificateException; +import java.security.interfaces.RSAPrivateKey; import java.util.Base64; import static java.lang.String.format; @@ -151,21 +149,14 @@ public class KeystoreSecurityKeyManager keyStore.load(inputStream, config.getKeystorePassword().toCharArray()); Key key = keyStore.getKey(catalogName, config.getKeystorePassword().toCharArray()); - if (key instanceof SecretKey) { - keyStr = new String(Base64.getDecoder().decode(key.getEncoded()), Charset.forName(UTF_8)).toCharArray(); - LOG.info("success to load key for catalog[%s]...", catalogName); - } - else if (key instanceof PrivateKey) { - Certificate certificate = keyStore.getCertificate(catalogName); - PublicKey publicKey = certificate.getPublicKey(); - keyStr = new String(Base64.getEncoder().encode(publicKey.getEncoded()), Charset.forName(UTF_8)).toCharArray(); - } - - if (key == null) { - Certificate certificate = keyStore.getCertificate(catalogName); - if (certificate != null) { - PublicKey publicKey = certificate.getPublicKey(); - keyStr = new String(Base64.getEncoder().encode(publicKey.getEncoded()), Charset.forName(UTF_8)).toCharArray(); + if (key != null) { + if (key instanceof SecretKey) { + keyStr = new String(Base64.getDecoder().decode(key.getEncoded()), Charset.forName(UTF_8)).toCharArray(); + LOG.info("success to load dynamic catalog key for catalog[%s]...", catalogName); + } + else if (key instanceof RSAPrivateKey) { + keyStr = new String(Base64.getEncoder().encode(key.getEncoded()), Charset.forName(UTF_8)).toCharArray(); + LOG.info("success to load static catalog key for catalog[%s]...", catalogName); } } } diff --git a/presto-main/src/main/java/io/prestosql/security/PasswordSecurityConfig.java b/presto-main/src/main/java/io/prestosql/security/PasswordSecurityConfig.java index 1d0561d73..c4b7c6dc2 100644 --- a/presto-main/src/main/java/io/prestosql/security/PasswordSecurityConfig.java +++ b/presto-main/src/main/java/io/prestosql/security/PasswordSecurityConfig.java @@ -93,7 +93,7 @@ public class PasswordSecurityConfig return rsaPadding; } - @Config("security.key.rsa-padding") + @Config("security.key.cipher-transformations") public void setRsaPadding(String rsaPadding) { this.rsaPadding = rsaPadding; diff --git a/presto-main/src/main/java/io/prestosql/security/RsaCipherTextDecrypt.java b/presto-main/src/main/java/io/prestosql/security/RsaCipherTextDecrypt.java index e89887d7a..8b8cde95c 100644 --- a/presto-main/src/main/java/io/prestosql/security/RsaCipherTextDecrypt.java +++ b/presto-main/src/main/java/io/prestosql/security/RsaCipherTextDecrypt.java @@ -29,8 +29,8 @@ import java.io.IOException; import java.nio.charset.Charset; import java.security.KeyFactory; import java.security.Security; -import java.security.interfaces.RSAPublicKey; -import java.security.spec.X509EncodedKeySpec; +import java.security.interfaces.RSAPrivateKey; +import java.security.spec.PKCS8EncodedKeySpec; import java.util.Base64; import static java.lang.String.format; @@ -58,20 +58,20 @@ public final class RsaCipherTextDecrypt { try { KeyFactory factory = KeyFactory.getInstance(RSA); - // decode base64 of public key + // decode base64 of private key char[] secretKey = keyManager.getKey(keyName); if (secretKey == null) { throw new RuntimeException(format("%s not exist.", keyName)); } byte[] key = Base64.getDecoder().decode(new String(secretKey)); - // generate the public key - X509EncodedKeySpec spec = new X509EncodedKeySpec(key); - RSAPublicKey publicKey = (RSAPublicKey) factory.generatePublic(spec); + // generate the private key + PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(key); + RSAPrivateKey privateKey = (RSAPrivateKey) factory.generatePrivate(pkcs8EncodedKeySpec); Cipher cipher = Cipher.getInstance(config.getRsaPadding(), BC_PROVIDER); - cipher.init(Cipher.DECRYPT_MODE, publicKey); + cipher.init(Cipher.DECRYPT_MODE, privateKey); // decode base64 of cipher text byte[] content = Base64.getDecoder().decode(cipherText); - int keySize = publicKey.getModulus().bitLength(); + int keySize = privateKey.getModulus().bitLength(); // decrypt cipher text return new String(rsaSplitCodec(cipher, content, keySize), CHARSET); } diff --git a/presto-main/src/test/java/io/prestosql/catalog/TestPasswordDecryption.java b/presto-main/src/test/java/io/prestosql/catalog/TestPasswordDecryption.java index f7177aff6..8b9b7ec8b 100644 --- a/presto-main/src/test/java/io/prestosql/catalog/TestPasswordDecryption.java +++ b/presto-main/src/test/java/io/prestosql/catalog/TestPasswordDecryption.java @@ -36,13 +36,13 @@ public class TestPasswordDecryption throws Exception { // save the key - String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArEhOFoAk46GQzet7C/tmod5Sju91+dDl28TtuFXqOvSz5vvjuEkIK6NI411Lb11vF2P1a9J4ctcA3V3VvXk+H9IsW2jzuXZ774RaACNfMyslmHB+JOoPbTzUSVLyNfb3eSmEhkfYYUrKqlz4tvXUm5FJRX2Xh83yYX1FAnOpuMwzbwaMVLqb8k7LP2uI9+2dTTocE51K3SDH0KoFMyW/uSF9Jj9HLQ1rI9DxCH8UIf7SEwSZ0Pq42fxNW1qjjanYF5tHIp/5l2/O4LUNnZaMTISmT9m9lYt8FTudMtWCMNWarTk8JNkui4x7cSbmE5QaP+s994LK2umBXl95esUSsQIDAQAB"; + String privateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDE9YRkOjcXKPKxCTUfojpl3prOPgprGkibQc62V8CnvoL7wI3I8v+JAPn+3sLOl2rNN8ziQxW6eCThbvnIo0ID6i+FeNcv5DngPMLHnUkTPs8uTXsc055WaNhx/6YwQa6dlnmaiOhIPoLmHqmZYGrlwLB9O5qpW2wOeFnQ/JbdeeUPIMy0srFia+j/MklXwm+9hGG+Cn0h7EnzIR6rrCrkai4Axqma4pDWPCAOI1G34H2BntSjqMGifhyHS2U6QuO7MC8fsYSVMvkkk7F6dR3jhQpjd3dmPZeK2o8CRTrymLG86wgaqDbz/DCnZaSJuGmcWPTAfl5GNicwJ/MSMJO7AgMBAAECggEAJgkDuBdF7EMMGwQcLi+191Y1rv5sJKK+wrzCnpPzsHEp+lQFDXlfv6VgoceC90JmbZsJBejOmWP6O06jDgv5A6iF5NChPa5lPth9BO9q3TyT5e0wiTCUszssEVe9UDRe9C/K6/zkXo8z2Byzw9rKyfOcIZMRGwN8qo6zSZh9yecZVLesiE+d9nNJguypLQOnJlDH5U73qpWJHW0s2bZfNfgq3WPZGR5/pVXPd8MbQkNNdo71FMumCV6Xdu2kLkZVObDGg90bJmB4dzvH0grDB8HVeoQ3mkrQjRK3d5XW99SGaANNSqT1jeUXMBLBQONKhElqYNBOVXT9Hw7H2QGDgQKBgQDwynd1R13zvGFQgEZ6thwonXDkxTgmoyi9GIxMVsxQtbMJIo0211ndZ4ZCoeXm5DsTw7C+lzE/Bb+pkCuSUFbYpKnEOLOVgSKsaxKiV7NVr+i2rZgVZdTxPTwwDTekPUZo8ZMUX4ryNzjG02k9E/pNyq84iZJnlzlLoF3+cWzy7QKBgQDRZkzBQgqACLoChj1xjQAqcXklyhQZIkJXt4A5bwYvX8J0Xw8+ZTNn8lJo9g8TVcdmoTLJRRbYmWn2QHzOyf4YrjD44wj1KDfOrCYimShGDAcvNnxOSiZoVAZ90YHOGRgQjQIUdc9EWyHQUVuHGmJJn2tMrNWmTdQG2QO/ZLOERwKBgDV+xctob5cW4wffd8kLbHYZhFtO9Yqf9Q0Nxx2uqvXDaGM/KeBlN7HYrhtfnJQPYJCjiUDOlkJKJKqnPQbkkmbPLmhJsJwmdG2Z3Cn1EgKXcjwjlQYr+YMe96A1T4dNlbb69JIyJ8xoOFTz4w2Owq1Fumf1KHGbRz9mAXvl9y6BAoGBAM/JO5Dp/5FdF3c5ze7Hg8qaHyUoiRkHrd1s8YgMa47G7yaazX2U3pXfF3ef8wW0sNFeVA70x97XHRaGl1J7jfDfqSjP4SukZPxoRs8+O4CGnvpyjpcBbWtJNcfUBYKF1CNYSSAUZz/lToBwuuotfCqiTs8fEkKcKDFDVzysqJYxAoGBAMZny9cs/AZH33iZVedtHQZclcs1PJBMm8ZyTR9uSmDQYSeujO/5BFOQ5jNdpKEKxirm5ZNuPqDubbJW78aHpjRl/uUvmDZDY9fYbo9NVZXNn805RWT59zn1cAlRr629lHn7bbyXBVKDN9/z2fqaUkI7qj5Xbi/C+prVhJS15V2p"; String catalogName = "mysql001"; - securityKeyManager.saveKey(publicKey.toCharArray(), catalogName); + securityKeyManager.saveKey(privateKey.toCharArray(), catalogName); // set parameters - String connectionPasswordCipherText = "huOJCr35k6K2Dgn4InAMJHTyzGvcg+bgOvG+eUxcefML5jPBc3nWc4Wm0nedt1c6g/CKbQksUps/6KP1bcirdkBVwlfpmABwdfGMWuqAQLSUKyi4N1i0zexwDGRgTz0/FuTudlPFDF0XM3iJODB5XfStjxptBPGNAwnRxlmVYnxP2hXHxmY0wmFzk9ZbOj8fLM88dft5T03zBSnErftZ71MNyyskmksI+l9CVB7QDGEaMvhVDb9gSz1t8wTDrxlb0MTmJVl7n7Kw0B1MGmMqWKJA49YhfJJG8ZUPSMkrgTeIGwMqCDs1y2KOZORx5IXYdMJtL01td25OjcKenTuNwQ=="; - String sslPasswordCipherText = "cjLGNZadxWTIZTQRHkDeu4dBD79M4sKZ1fgWf39NvgBCiYflr/rvcUyCVlNQYV7WXFpl853bInMnzc+FaGk8039T+k7haK3uTk0o3itCAom2HtYcJzh3dhy8ZzsPLXsEldarYlTpFUbCNl3gepiZY98253Nn8J4n+eZidyfSGzecJC00Snfj6Ry7QiwqP90w5/CszMkAg97Ri0z28e5RN+xeM+wlXut2ap7hptpj5sbvJzaU9tjUJJZVxmkPdUk1jy48EpnG7YAtJftxLo6AcEaV7iK/7QaXOLGWUWeOAvGM4e8YIgJdxk8ptqvTAGw+9agRkKLP6Ujic+pPoHnnNA=="; + String connectionPasswordCipherText = "ov4otIMT9ZF9OU7NCTm+kie9GDAdxYiD+CGfROhzQfVXg7+clwyZ36wCONgFYOa/lDw6POLQGKbdsJzFn3SGfJPgEl/nvoseAjefXNBFGEppf+9bqMSRvw98SQJnhsogv5likU7MLeM8FzknNZBr0J6dtm7Y6pJMeWxJp7nJWFndJ2ba7NiRw7v8zsCt/VFMa3juCbpqyLhUBfUOMQI06k4O1HlYrdJL4g4EEmWuWg0HrIIb00SWrpBJb31jOSAy2FdKqW47t28z234uePBWz94hrTuWq/zdebbXVQBnFCaxCwLfdaJ//K8FCnrWoAOzzv9B5CRBcCbx2IF/4oyckQ=="; + String sslPasswordCipherText = "VDZK8r+u5BNw9Ihzomk0aHlSLuumDmSRq6asZjGiwsygnUbHBWQn4SsZd/oQ+9y4LefPCXx53Txz8H04tMzzd23+J4TYa+zc7PxHLkUwxTqR03dQTLlJVlDlc/dM7aEKapHZYSL3kzUWL1Qt0laocbx0hYpw0eF24J1QPpcEVv92MGy0WeqMwpdIu7FQbfhjixaY/Zsaz3V9mMM+RHjhgOnyMyx4MwrdEWCrJzTUz1wBaqt9LzO4rba5UD8VQM2K4fXpMrdBgHLSdZr5FQNisqiw1eEs/94pnAWWjlsRdlpwVDsN+niXvrJfyqKo3FC8DAhder+Ighxdluu3WSZORA=="; Map properties = new HashMap(); properties.put("connection-url", "jdbc:mysql://localhost:3306"); properties.put("connection-user", "root");