This is an automated email from the ASF dual-hosted git repository.

jiangtian pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/tsfile.git


The following commit(s) were added to refs/heads/develop by this push:
     new 686bbabb modify encrypt type (#311)
686bbabb is described below

commit 686bbabb47ca12c184b4dd0a7c2e89ae06a5a1e7
Author: jintao zhu <[email protected]>
AuthorDate: Mon Dec 2 10:05:11 2024 +0800

    modify encrypt type (#311)
    
    * modify encrypt type format
    
    * make key effective
    
    * change default type
    
    ---------
    
    Co-authored-by: zhujt <[email protected]>
---
 .../apache/tsfile/common/conf/TSFileConfig.java    |  9 ++---
 .../org/apache/tsfile/encrypt/EncryptUtils.java    | 43 +++++++++++++---------
 .../java/org/apache/tsfile/encrypt/IDecryptor.java | 26 +++----------
 .../java/org/apache/tsfile/encrypt/IEncrypt.java   |  2 +
 .../java/org/apache/tsfile/encrypt/IEncryptor.java | 26 +++----------
 .../java/org/apache/tsfile/write/TsFileWriter.java |  2 +-
 .../tsfile/encrypt/AES128TsFileReadWriteTest.java  |  2 +-
 7 files changed, 46 insertions(+), 64 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java 
b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
index eeef8345..99a71589 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/common/conf/TSFileConfig.java
@@ -161,11 +161,8 @@ public class TSFileConfig implements Serializable {
   /** encryptKey, this should be 16 bytes String. */
   private String encryptKey = "abcdefghijklmnop";
 
-  /**
-   * default encryptType is "org.apache.tsfile.encrypt.UNENCRYPTED", TsFile 
supports UNENCRYPTED or
-   * AES128.
-   */
-  private String encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
+  /** default encryptType is "UNENCRYPTED", TsFile supports UNENCRYPTED or 
AES128. */
+  private String encryptType = "UNENCRYPTED";
 
   /** Line count threshold for checking page memory occupied size. */
   private int pageCheckSizeThreshold = 100;
@@ -275,6 +272,8 @@ public class TSFileConfig implements Serializable {
       return;
     }
     this.encryptKey = EncryptUtils.getEncryptKeyFromPath(encryptKeyPath);
+    EncryptUtils.encryptParam = EncryptUtils.getEncryptParameter();
+    EncryptUtils.normalKeyStr = EncryptUtils.getNormalKeyStr();
   }
 
   public int getGroupSizeInByte() {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
index cae1ecac..4d70646b 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptUtils.java
@@ -21,6 +21,7 @@ package org.apache.tsfile.encrypt;
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.exception.encrypt.EncryptException;
+import org.apache.tsfile.exception.encrypt.EncryptKeyLengthNotMatchException;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -38,10 +39,25 @@ public class EncryptUtils {
 
   private static final String defaultKey = "abcdefghijklmnop";
 
+  private static final String encryptClassPrefix = 
"org.apache.tsfile.encrypt.";
+
   public static String normalKeyStr = getNormalKeyStr();
 
   public static EncryptParameter encryptParam = getEncryptParameter();
 
+  public static String getEncryptClass(String encryptType) {
+    String classNameRegex = "^(\\p{Alpha}\\w*)(\\.\\p{Alpha}\\w+)+$";
+    if (IEncrypt.encryptTypeToClassMap.containsKey(encryptType)) {
+      return IEncrypt.encryptTypeToClassMap.get(encryptType);
+    } else if (encryptType.matches(classNameRegex)) {
+      IEncrypt.encryptTypeToClassMap.put(encryptType, encryptType);
+      return encryptType;
+    } else {
+      IEncrypt.encryptTypeToClassMap.put(encryptType, encryptClassPrefix + 
encryptType);
+      return encryptClassPrefix + encryptType;
+    }
+  }
+
   public static String getEncryptKeyFromPath(String path) {
     if (path == null) {
       logger.error("encrypt key path is null, use the default key");
@@ -63,6 +79,9 @@ public class EncryptUtils {
           sb.append("\n").append(line);
         }
       }
+      if (sb.toString().length() != 16) {
+        throw new EncryptKeyLengthNotMatchException(16, 
sb.toString().length());
+      }
       return sb.toString();
     } catch (IOException e) {
       throw new EncryptException("Read main encrypt key error", e);
@@ -117,7 +136,7 @@ public class EncryptUtils {
       return str;
     } catch (Exception e) {
       throw new EncryptException(
-          "SHA-256 function not found while using SHA-256 to generate data 
key");
+          "SHA-256 function not found while using SHA-256 to generate data 
key", e);
     }
   }
 
@@ -178,13 +197,14 @@ public class EncryptUtils {
 
   public static IEncrypt getEncrypt(String encryptType, byte[] dataEncryptKey) 
{
     try {
-      if (IEncrypt.encryptMap.containsKey(encryptType)) {
-        return ((IEncrypt) 
IEncrypt.encryptMap.get(encryptType).newInstance(dataEncryptKey));
+      String className = getEncryptClass(encryptType);
+      if (IEncrypt.encryptMap.containsKey(className)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(className).newInstance(dataEncryptKey));
       }
-      Class<?> encryptTypeClass = Class.forName(encryptType);
+      Class<?> encryptTypeClass = Class.forName(className);
       java.lang.reflect.Constructor<?> constructor =
           encryptTypeClass.getDeclaredConstructor(byte[].class);
-      IEncrypt.encryptMap.put(encryptType, constructor);
+      IEncrypt.encryptMap.put(className, constructor);
       return ((IEncrypt) constructor.newInstance(dataEncryptKey));
     } catch (ClassNotFoundException e) {
       throw new EncryptException("Get encryptor class failed: " + encryptType, 
e);
@@ -213,18 +233,7 @@ public class EncryptUtils {
       encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       dataEncryptKey = null;
     }
-    try {
-      Class<?> encryptTypeClass = Class.forName(encryptType);
-      java.lang.reflect.Constructor<?> constructor =
-          encryptTypeClass.getDeclaredConstructor(byte[].class);
-      return ((IEncrypt) constructor.newInstance(dataEncryptKey));
-    } catch (ClassNotFoundException e) {
-      throw new EncryptException("Get encryptor class failed: " + encryptType, 
e);
-    } catch (NoSuchMethodException e) {
-      throw new EncryptException("Get constructor for encryptor failed: " + 
encryptType, e);
-    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
-      throw new EncryptException("New encryptor instance failed: " + 
encryptType, e);
-    }
+    return getEncrypt(encryptType, dataEncryptKey);
   }
 
   public static byte[] getSecondKeyFromStr(String str) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
index 36b90897..bdf90b92 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IDecryptor.java
@@ -34,13 +34,14 @@ public interface IDecryptor {
 
   static IDecryptor getDecryptor(String type, byte[] key) {
     try {
-      if (IEncrypt.encryptMap.containsKey(type)) {
-        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getDecryptor();
+      String className = EncryptUtils.getEncryptClass(type);
+      if (IEncrypt.encryptMap.containsKey(className)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(className).newInstance(key)).getDecryptor();
       }
-      Class<?> encryptClass = Class.forName(type);
+      Class<?> encryptClass = Class.forName(className);
       java.lang.reflect.Constructor<?> constructor =
           encryptClass.getDeclaredConstructor(byte[].class);
-      IEncrypt.encryptMap.put(type, constructor);
+      IEncrypt.encryptMap.put(className, constructor);
       return ((IEncrypt) constructor.newInstance(key)).getDecryptor();
     } catch (ClassNotFoundException e) {
       throw new EncryptException("Get decryptor class failed: " + type, e);
@@ -54,22 +55,7 @@ public interface IDecryptor {
   static IDecryptor getDecryptor(EncryptParameter encryptParam) {
     String type = encryptParam.getType();
     byte[] key = encryptParam.getKey();
-    try {
-      if (IEncrypt.encryptMap.containsKey(type)) {
-        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getDecryptor();
-      }
-      Class<?> encryptClass = Class.forName(type);
-      java.lang.reflect.Constructor<?> constructor =
-          encryptClass.getDeclaredConstructor(byte[].class);
-      IEncrypt.encryptMap.put(type, constructor);
-      return ((IEncrypt) constructor.newInstance(key)).getDecryptor();
-    } catch (ClassNotFoundException e) {
-      throw new EncryptException("Get decryptor class failed: " + type, e);
-    } catch (NoSuchMethodException e) {
-      throw new EncryptException("Get constructor for decryptor failed: " + 
type, e);
-    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
-      throw new EncryptException("New decryptor instance failed: " + type, e);
-    }
+    return getDecryptor(type, key);
   }
 
   byte[] decrypt(byte[] data);
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
index 24b691d2..0ea6bbef 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncrypt.java
@@ -25,6 +25,8 @@ public interface IEncrypt {
   static ConcurrentHashMap<String, java.lang.reflect.Constructor<?>> 
encryptMap =
       new ConcurrentHashMap<>();
 
+  static ConcurrentHashMap<String, String> encryptTypeToClassMap = new 
ConcurrentHashMap<>();
+
   IDecryptor getDecryptor();
 
   IEncryptor getEncryptor();
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
index b80d2579..4fa63fd1 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/IEncryptor.java
@@ -34,13 +34,14 @@ public interface IEncryptor {
 
   static IEncryptor getEncryptor(String type, byte[] key) {
     try {
-      if (IEncrypt.encryptMap.containsKey(type)) {
-        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getEncryptor();
+      String className = EncryptUtils.getEncryptClass(type);
+      if (IEncrypt.encryptMap.containsKey(className)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(className).newInstance(key)).getEncryptor();
       }
-      Class<?> encryptClass = Class.forName(type);
+      Class<?> encryptClass = Class.forName(className);
       java.lang.reflect.Constructor<?> constructor =
           encryptClass.getDeclaredConstructor(byte[].class);
-      IEncrypt.encryptMap.put(type, constructor);
+      IEncrypt.encryptMap.put(className, constructor);
       return ((IEncrypt) constructor.newInstance(key)).getEncryptor();
     } catch (ClassNotFoundException e) {
       throw new EncryptException("Get encryptor class failed: " + type, e);
@@ -54,22 +55,7 @@ public interface IEncryptor {
   static IEncryptor getEncryptor(EncryptParameter encryptParam) {
     String type = encryptParam.getType();
     byte[] key = encryptParam.getKey();
-    try {
-      if (IEncrypt.encryptMap.containsKey(type)) {
-        return ((IEncrypt) 
IEncrypt.encryptMap.get(type).newInstance(key)).getEncryptor();
-      }
-      Class<?> encryptClass = Class.forName(type);
-      java.lang.reflect.Constructor<?> constructor =
-          encryptClass.getDeclaredConstructor(byte[].class);
-      IEncrypt.encryptMap.put(type, constructor);
-      return ((IEncrypt) constructor.newInstance(key)).getEncryptor();
-    } catch (ClassNotFoundException e) {
-      throw new EncryptException("Get encryptor class failed: " + type, e);
-    } catch (NoSuchMethodException e) {
-      throw new EncryptException("Get constructor for encryptor failed: " + 
type, e);
-    } catch (InvocationTargetException | InstantiationException | 
IllegalAccessException e) {
-      throw new EncryptException("New encryptor instance failed: " + type, e);
-    }
+    return getEncryptor(type, key);
   }
 
   byte[] encrypt(byte[] data);
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
index 20a38078..a8aae270 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/TsFileWriter.java
@@ -202,7 +202,7 @@ public class TsFileWriter implements AutoCloseable {
                 .encrypt(dataEncryptKey);
       } catch (Exception e) {
         throw new EncryptException(
-            "SHA-256 function not found while using SHA-256 to generate data 
key");
+            "SHA-256 function not found while using SHA-256 to generate data 
key", e);
       }
     } else {
       encryptLevel = "0";
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
index a9e9d16d..f11c376d 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/encrypt/AES128TsFileReadWriteTest.java
@@ -66,7 +66,7 @@ public class AES128TsFileReadWriteTest {
   @Before
   public void setUp() {
     conf.setEncryptFlag("true");
-    conf.setEncryptType("org.apache.tsfile.encrypt.AES128");
+    conf.setEncryptType("AES128");
     conf.setEncryptKey("thisisourtestkey");
     f = new File(path);
     if (f.exists()) {

Reply via email to