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 38a847dd generate main key (#519)
38a847dd is described below

commit 38a847ddae3e26030208fbee9bcbc61e98e342f9
Author: jintao zhu <[email protected]>
AuthorDate: Thu Aug 14 15:16:31 2025 +0800

    generate main key (#519)
    
    * add save_encrypt_key option
    
    * review codes
---
 .../apache/tsfile/common/conf/TSFileConfig.java    | 15 ++++++-
 .../org/apache/tsfile/encrypt/EncryptUtils.java    | 48 ++--------------------
 .../tsfile/file/metadata/TsFileMetadata.java       |  8 ++++
 .../apache/tsfile/read/UnClosedTsFileReader.java   |  2 +-
 4 files changed, 25 insertions(+), 48 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 709af3c0..eb49b718 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
@@ -174,11 +174,14 @@ public class TSFileConfig implements Serializable {
   private CompressionType compressor = CompressionType.LZ4;
 
   /** encryptKey, this should be 16 bytes String. */
-  private byte[] encryptKey = 
"abcdefghijklmnop".getBytes(TSFileConfig.STRING_CHARSET);
+  private byte[] encryptKey;
 
   /** Data encryption method, default encryptType is "UNENCRYPTED". */
   private String encryptType = "UNENCRYPTED";
 
+  /** Salt for encrypt, this should be 16 bytes String. */
+  private byte[] encryptSalt = EncryptUtils.generateSalt();
+
   /** Line count threshold for checking page memory occupied size. */
   private int pageCheckSizeThreshold = 100;
 
@@ -277,7 +280,15 @@ public class TSFileConfig implements Serializable {
   }
 
   public void setEncryptKeyFromToken(String token) {
-    this.encryptKey = EncryptUtils.getEncryptKeyFromToken(token);
+    this.encryptKey = EncryptUtils.getEncryptKeyFromToken(token, encryptSalt);
+  }
+
+  public void setEncryptSalt(byte[] encryptSalt) {
+    this.encryptSalt = encryptSalt;
+  }
+
+  public byte[] getEncryptSalt() {
+    return this.encryptSalt;
   }
 
   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 a6216754..97b7ad57 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
@@ -28,9 +28,6 @@ import org.slf4j.LoggerFactory;
 import javax.crypto.Mac;
 import javax.crypto.spec.SecretKeySpec;
 
-import java.io.BufferedReader;
-import java.io.FileReader;
-import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.security.InvalidKeyException;
 import java.security.MessageDigest;
@@ -43,8 +40,6 @@ public class EncryptUtils {
 
   private static final Logger logger = 
LoggerFactory.getLogger(EncryptUtils.class);
 
-  private static final String defaultKey = "abcdefghijklmnop";
-
   private static final String encryptClassPrefix = 
"org.apache.tsfile.encrypt.";
 
   private static volatile String normalKeyStr;
@@ -81,47 +76,10 @@ public class EncryptUtils {
     }
   }
 
-  public static String getEncryptKeyFromPath(String path) {
-    if (path == null) {
-      return defaultKey;
-    }
-    if (path.isEmpty()) {
-      return defaultKey;
-    }
-    try (BufferedReader br = new BufferedReader(new FileReader(path))) {
-      StringBuilder sb = new StringBuilder();
-      String line;
-      boolean first = true;
-      while ((line = br.readLine()) != null) {
-        if (first) {
-          sb.append(line);
-          first = false;
-        } else {
-          sb.append("\n").append(line);
-        }
-      }
-      String str = sb.toString();
-      if (str.isEmpty()) {
-        return defaultKey;
-      }
-      if (str.length() != 16) {
-        throw new EncryptException(
-            "The length of the key("
-                + str
-                + ") in the file is not 16 bytes, please check the key file:"
-                + path);
-      }
-      return str;
-    } catch (IOException e) {
-      throw new EncryptException("Read main encrypt key error", e);
-    }
-  }
-
-  public static byte[] getEncryptKeyFromToken(String token) {
+  public static byte[] getEncryptKeyFromToken(String token, byte[] salt) {
     if (token == null || token.trim().isEmpty()) {
-      return defaultKey.getBytes();
+      return generateSalt();
     }
-    byte[] salt = generateSalt();
     try {
       return deriveKeyInternal(token.getBytes(), salt, ITERATION_COUNT, dkLen);
     } catch (NoSuchAlgorithmException | InvalidKeyException e) {
@@ -184,7 +142,7 @@ public class EncryptUtils {
     return Mac.getInstance(HMAC_ALGORITHM).getMacLength();
   }
 
-  private static byte[] generateSalt() {
+  public static byte[] generateSalt() {
     byte[] salt = new byte[SALT_LENGTH];
     new SecureRandom().nextBytes(salt);
     return salt;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
index c0e6b464..5c77055c 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/file/metadata/TsFileMetadata.java
@@ -35,6 +35,7 @@ import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.TreeMap;
 
 /** TSFileMetaData collects all metadata info and saves in its data structure. 
*/
@@ -154,6 +155,13 @@ public class TsFileMetadata {
         if (propertiesMap.get("encryptKey") == null || 
propertiesMap.get("encryptKey").isEmpty()) {
           throw new EncryptException("TsfileMetadata null encryptKey while 
encryptLevel is 2");
         }
+        if (Objects.equals(
+                TSFileDescriptor.getInstance().getConfig().getEncryptType(),
+                "org.apache.tsfile.encrypt.UNENCRYPTED")
+            || Objects.equals(
+                TSFileDescriptor.getInstance().getConfig().getEncryptType(), 
"UNENCRYPTED")) {
+          throw new EncryptException("fail to decrypt encrypted tsfile in 
unencrypted system");
+        }
         IDecryptor decryptor =
             IDecryptor.getDecryptor(
                 propertiesMap.get("encryptType"),
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/UnClosedTsFileReader.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/UnClosedTsFileReader.java
index f21b9713..ce76fbc8 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/UnClosedTsFileReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/UnClosedTsFileReader.java
@@ -40,7 +40,7 @@ public class UnClosedTsFileReader extends 
TsFileSequenceReader {
 
   // ioSizeRecorder can be null
   public UnClosedTsFileReader(
-      String file, EncryptParameter decryptParam, LongConsumer ioSizeRecorder) 
throws IOException {
+      String file, EncryptParameter encryptParam, LongConsumer ioSizeRecorder) 
throws IOException {
     super(file, false, ioSizeRecorder);
     this.encryptParam = encryptParam;
   }

Reply via email to