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 64a9d8ab encrypt thread safety (#278)
64a9d8ab is described below

commit 64a9d8ab88fb18a4508e0f9fc67f448004227a73
Author: jintao zhu <[email protected]>
AuthorDate: Thu Oct 31 11:22:05 2024 +0800

    encrypt thread safety (#278)
    
    * encrypt thread safety
    
    * simplify duplicate codes
    
    ---------
    
    Co-authored-by: zhujt <[email protected]>
---
 .../apache/tsfile/encrypt/EncryptParameter.java    | 38 +++++++++++++++++
 .../org/apache/tsfile/encrypt/EncryptUtils.java    | 30 +++++++++-----
 .../java/org/apache/tsfile/encrypt/IDecryptor.java | 21 ++++++++++
 .../java/org/apache/tsfile/encrypt/IEncryptor.java | 21 ++++++++++
 .../tsfile/file/metadata/TsFileMetadata.java       | 15 ++-----
 .../apache/tsfile/read/TsFileSequenceReader.java   | 15 +++----
 .../apache/tsfile/read/UnClosedTsFileReader.java   | 14 +++----
 .../java/org/apache/tsfile/read/common/Chunk.java  | 20 ++++-----
 .../read/controller/CachedChunkLoaderImpl.java     |  4 +-
 .../reader/chunk/AbstractAlignedChunkReader.java   |  8 ++--
 .../tsfile/read/reader/chunk/ChunkReader.java      |  7 ++--
 .../tsfile/read/reader/page/LazyLoadPageData.java  | 10 +++--
 .../java/org/apache/tsfile/write/TsFileWriter.java |  9 +++--
 .../write/chunk/AlignedChunkGroupWriterImpl.java   | 16 ++++----
 .../tsfile/write/chunk/AlignedChunkWriterImpl.java | 47 +++++++++++-----------
 .../apache/tsfile/write/chunk/ChunkWriterImpl.java | 19 ++++-----
 .../chunk/NonAlignedChunkGroupWriterImpl.java      | 14 +++----
 .../apache/tsfile/write/chunk/TimeChunkWriter.java | 15 +++----
 .../tsfile/write/chunk/ValueChunkWriter.java       | 14 +++----
 .../org/apache/tsfile/write/page/PageWriter.java   | 20 +++++----
 .../apache/tsfile/write/page/TimePageWriter.java   | 11 +++--
 .../apache/tsfile/write/page/ValuePageWriter.java  | 14 ++++---
 .../tsfile/read/UnClosedTsFileReaderTest.java      |  3 +-
 23 files changed, 246 insertions(+), 139 deletions(-)

diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptParameter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptParameter.java
new file mode 100644
index 00000000..f7adb522
--- /dev/null
+++ b/java/tsfile/src/main/java/org/apache/tsfile/encrypt/EncryptParameter.java
@@ -0,0 +1,38 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tsfile.encrypt;
+
+public class EncryptParameter {
+
+  private final String type;
+  private final byte[] key;
+
+  public EncryptParameter(String type, byte[] key) {
+    this.type = type;
+    this.key = key;
+  }
+
+  public byte[] getKey() {
+    return key;
+  }
+
+  public String getType() {
+    return type;
+  }
+}
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 034eb40c..b9bcf601 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
@@ -39,11 +39,7 @@ public class EncryptUtils {
 
   public static String normalKeyStr = getNormalKeyStr();
 
-  public static IEncrypt encrypt = getEncrypt();
-
-  public static IEncryptor encryptor = encrypt.getEncryptor();
-
-  public static IDecryptor decryptor = encrypt.getDecryptor();
+  public static EncryptParameter encryptParam = getEncryptParameter();
 
   public static String getEncryptKeyFromPath(String path) {
     if (path == null) {
@@ -148,15 +144,19 @@ public class EncryptUtils {
     }
   }
 
-  public static IEncrypt getEncrypt() {
+  public static EncryptParameter getEncryptParameter() {
+    return getEncryptParameter(TSFileDescriptor.getInstance().getConfig());
+  }
+
+  public static EncryptParameter getEncryptParameter(TSFileConfig conf) {
     String encryptType;
     byte[] dataEncryptKey;
-    if (TSFileDescriptor.getInstance().getConfig().getEncryptFlag()) {
-      encryptType = 
TSFileDescriptor.getInstance().getConfig().getEncryptType();
+    if (conf.getEncryptFlag()) {
+      encryptType = conf.getEncryptType();
       try {
         MessageDigest md = MessageDigest.getInstance("MD5");
         md.update("IoTDB is the best".getBytes());
-        
md.update(TSFileDescriptor.getInstance().getConfig().getEncryptKey().getBytes());
+        md.update(conf.getEncryptKey().getBytes());
         dataEncryptKey = md.digest();
       } catch (Exception e) {
         throw new EncryptException(
@@ -166,10 +166,22 @@ public class EncryptUtils {
       encryptType = "org.apache.tsfile.encrypt.UNENCRYPTED";
       dataEncryptKey = null;
     }
+    return new EncryptParameter(encryptType, dataEncryptKey);
+  }
+
+  public static IEncrypt getEncrypt() {
+    return getEncrypt(TSFileDescriptor.getInstance().getConfig());
+  }
+
+  public static IEncrypt getEncrypt(String encryptType, byte[] dataEncryptKey) 
{
     try {
+      if (IEncrypt.encryptMap.containsKey(encryptType)) {
+        return ((IEncrypt) 
IEncrypt.encryptMap.get(encryptType).newInstance(dataEncryptKey));
+      }
       Class<?> encryptTypeClass = Class.forName(encryptType);
       java.lang.reflect.Constructor<?> constructor =
           encryptTypeClass.getDeclaredConstructor(byte[].class);
+      IEncrypt.encryptMap.put(encryptType, constructor);
       return ((IEncrypt) constructor.newInstance(dataEncryptKey));
     } catch (ClassNotFoundException e) {
       throw new EncryptException("Get encryptor class failed: " + encryptType, 
e);
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 a7be7b73..36b90897 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
@@ -51,6 +51,27 @@ 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);
+    }
+  }
+
   byte[] decrypt(byte[] data);
 
   byte[] decrypt(byte[] data, int offset, int size);
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 d26ab9dc..b80d2579 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
@@ -51,6 +51,27 @@ 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);
+    }
+  }
+
   byte[] encrypt(byte[] data);
 
   byte[] encrypt(byte[] data, int offset, int size);
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 e57c9cff..e6c56688 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
@@ -21,9 +21,9 @@ package org.apache.tsfile.file.metadata;
 
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.compatibility.DeserializeConfig;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IDecryptor;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.exception.encrypt.EncryptException;
 import org.apache.tsfile.utils.BloomFilter;
 import org.apache.tsfile.utils.ReadWriteForEncodingUtils;
@@ -162,18 +162,11 @@ public class TsFileMetadata {
     return fileMetaData;
   }
 
-  public IEncryptor getIEncryptor() {
+  public EncryptParameter getEncryptParam() {
     if (dataEncryptKey == null) {
-      return IEncryptor.getEncryptor("org.apache.tsfile.encrypt.UNENCRYPTED", 
null);
+      return new EncryptParameter("org.apache.tsfile.encrypt.UNENCRYPTED", 
null);
     }
-    return IEncryptor.getEncryptor(encryptType, dataEncryptKey);
-  }
-
-  public IDecryptor getIDecryptor() {
-    if (dataEncryptKey == null) {
-      return IDecryptor.getDecryptor("org.apache.tsfile.encrypt.UNENCRYPTED", 
null);
-    }
-    return IDecryptor.getDecryptor(encryptType, dataEncryptKey);
+    return new EncryptParameter(encryptType, dataEncryptKey);
   }
 
   public void addProperty(String key, String value) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
index e341363b..817078a1 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/TsFileSequenceReader.java
@@ -26,6 +26,7 @@ import org.apache.tsfile.compatibility.CompatibilityUtils;
 import org.apache.tsfile.compatibility.DeserializeConfig;
 import org.apache.tsfile.compress.IUnCompressor;
 import org.apache.tsfile.encoding.decoder.Decoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.enums.TSDataType;
@@ -376,14 +377,14 @@ public class TsFileSequenceReader implements 
AutoCloseable {
    * @return the decryptor for the TsFile
    * @throws IOException if an I/O error occurs while reading the file metadata
    */
-  public IDecryptor getDecryptor() throws IOException {
+  public EncryptParameter getEncryptParam() throws IOException {
     try {
       readFileMetadata();
     } catch (Exception e) {
       logger.error("Something error happened while reading file metadata of 
file {}", file, e);
-      return EncryptUtils.encrypt.getDecryptor();
+      return EncryptUtils.encryptParam;
     }
-    return tsFileMetaData.getIDecryptor();
+    return tsFileMetaData.getEncryptParam();
   }
 
   /**
@@ -1583,7 +1584,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
     try {
       ChunkHeader header = readChunkHeader(offset);
       ByteBuffer buffer = readChunk(offset + header.getSerializedSize(), 
header.getDataSize());
-      return new Chunk(header, buffer, getDecryptor());
+      return new Chunk(header, buffer, getEncryptParam());
     } catch (StopReadTsFileByInterruptException e) {
       throw e;
     } catch (Throwable t) {
@@ -1609,7 +1610,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
           buffer,
           metaData.getDeleteIntervalList(),
           metaData.getStatistics(),
-          getDecryptor());
+          getEncryptParam());
     } catch (StopReadTsFileByInterruptException e) {
       throw e;
     } catch (Throwable t) {
@@ -1635,7 +1636,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
         buffer,
         chunkCacheKey.getDeleteIntervalList(),
         chunkCacheKey.getStatistics(),
-        getDecryptor());
+        getEncryptParam());
   }
 
   /**
@@ -1707,7 +1708,7 @@ public class TsFileSequenceReader implements 
AutoCloseable {
 
   public ByteBuffer readPage(PageHeader header, CompressionType type) throws 
IOException {
     ByteBuffer buffer = readData(-1, header.getCompressedSize());
-    IDecryptor decryptor = getDecryptor();
+    IDecryptor decryptor = IDecryptor.getDecryptor(getEncryptParam());
     if (header.getUncompressedSize() == 0) {
       return buffer;
     }
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 930bfcc2..817f0f46 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
@@ -19,8 +19,8 @@
 
 package org.apache.tsfile.read;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.exception.NotImplementedException;
 import org.apache.tsfile.file.metadata.TsFileMetadata;
 
@@ -29,16 +29,16 @@ import java.io.IOException;
 /** A class for reading unclosed tsfile. */
 public class UnClosedTsFileReader extends TsFileSequenceReader {
 
-  private IDecryptor decryptor;
+  private EncryptParameter encryptParam;
 
   public UnClosedTsFileReader(String file) throws IOException {
     super(file, false);
-    decryptor = EncryptUtils.decryptor;
+    encryptParam = EncryptUtils.encryptParam;
   }
 
-  public UnClosedTsFileReader(String file, IDecryptor decryptor) throws 
IOException {
+  public UnClosedTsFileReader(String file, EncryptParameter decryptParam) 
throws IOException {
     super(file, false);
-    this.decryptor = decryptor;
+    this.encryptParam = encryptParam;
   }
 
   /** unclosed file has no tail magic data. */
@@ -54,7 +54,7 @@ public class UnClosedTsFileReader extends 
TsFileSequenceReader {
   }
 
   @Override
-  public IDecryptor getDecryptor() {
-    return decryptor;
+  public EncryptParameter getEncryptParam() {
+    return encryptParam;
   }
 }
diff --git a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java 
b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
index e338ae06..b72c0085 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/read/common/Chunk.java
@@ -19,8 +19,8 @@
 
 package org.apache.tsfile.read.common;
 
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.file.MetaMarker;
 import org.apache.tsfile.file.header.ChunkHeader;
 import org.apache.tsfile.file.metadata.statistics.Statistics;
@@ -46,7 +46,7 @@ public class Chunk {
   private ByteBuffer chunkData;
   private Statistics chunkStatistic;
 
-  private IDecryptor decryptor;
+  private EncryptParameter encryptParam;
 
   /** A list of deleted intervals. */
   private List<TimeRange> deleteIntervalList;
@@ -60,7 +60,7 @@ public class Chunk {
     this.chunkData = buffer;
     this.deleteIntervalList = deleteIntervalList;
     this.chunkStatistic = chunkStatistic;
-    this.decryptor = EncryptUtils.encrypt.getDecryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
   public Chunk(
@@ -68,28 +68,28 @@ public class Chunk {
       ByteBuffer buffer,
       List<TimeRange> deleteIntervalList,
       Statistics chunkStatistic,
-      IDecryptor decryptor) {
+      EncryptParameter encryptParam) {
     this.chunkHeader = header;
     this.chunkData = buffer;
     this.deleteIntervalList = deleteIntervalList;
     this.chunkStatistic = chunkStatistic;
-    this.decryptor = decryptor;
+    this.encryptParam = encryptParam;
   }
 
   public Chunk(ChunkHeader header, ByteBuffer buffer) {
     this.chunkHeader = header;
     this.chunkData = buffer;
-    this.decryptor = EncryptUtils.encrypt.getDecryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
-  public Chunk(ChunkHeader header, ByteBuffer buffer, IDecryptor decryptor) {
+  public Chunk(ChunkHeader header, ByteBuffer buffer, EncryptParameter 
encryptParam) {
     this.chunkHeader = header;
     this.chunkData = buffer;
-    this.decryptor = decryptor;
+    this.encryptParam = encryptParam;
   }
 
-  public IDecryptor getDecryptor() {
-    return decryptor;
+  public EncryptParameter getEncryptParam() {
+    return encryptParam;
   }
 
   public ChunkHeader getHeader() {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/CachedChunkLoaderImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/CachedChunkLoaderImpl.java
index 9ba86913..92925ea8 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/controller/CachedChunkLoaderImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/controller/CachedChunkLoaderImpl.java
@@ -74,7 +74,7 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
         chunk.getData().duplicate(),
         chunkMetaData.getDeleteIntervalList(),
         chunkMetaData.getStatistics(),
-        reader.getDecryptor());
+        reader.getEncryptParam());
   }
 
   @Override
@@ -92,7 +92,7 @@ public class CachedChunkLoaderImpl implements IChunkLoader {
             chunk.getData().duplicate(),
             chunkMetaData.getDeleteIntervalList(),
             chunkMetaData.getStatistics(),
-            reader.getDecryptor()),
+            reader.getEncryptParam()),
         globalTimeFilter);
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/AbstractAlignedChunkReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/AbstractAlignedChunkReader.java
index 165367e2..220f9582 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/AbstractAlignedChunkReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/AbstractAlignedChunkReader.java
@@ -21,6 +21,7 @@ package org.apache.tsfile.read.reader.chunk;
 
 import org.apache.tsfile.compress.IUnCompressor;
 import org.apache.tsfile.encoding.decoder.Decoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.MetaMarker;
@@ -52,7 +53,7 @@ public abstract class AbstractAlignedChunkReader extends 
AbstractChunkReader {
   // deleted intervals of all the sub sensors
   private final List<List<TimeRange>> valueDeleteIntervalsList = new 
ArrayList<>();
 
-  private final IDecryptor decrytor;
+  private final EncryptParameter encryptParam;
 
   @SuppressWarnings("unchecked")
   AbstractAlignedChunkReader(
@@ -71,7 +72,7 @@ public abstract class AbstractAlignedChunkReader extends 
AbstractChunkReader {
 
           valueChunkStatisticsList.add(chunk == null ? null : 
chunk.getChunkStatistic());
         });
-    this.decrytor = timeChunk.getDecryptor();
+    this.encryptParam = timeChunk.getEncryptParam();
     initAllPageReaders(timeChunk.getChunkStatistic(), 
valueChunkStatisticsList);
   }
 
@@ -179,6 +180,7 @@ public abstract class AbstractAlignedChunkReader extends 
AbstractChunkReader {
 
   private AbstractAlignedPageReader constructAlignedPageReader(
       PageHeader timePageHeader, List<PageHeader> rawValuePageHeaderList) 
throws IOException {
+    IDecryptor decrytor = IDecryptor.getDecryptor(encryptParam);
     ByteBuffer timePageData =
         ChunkReader.deserializePageData(
             timePageHeader, timeChunkDataBuffer, timeChunkHeader, decrytor);
@@ -222,7 +224,7 @@ public abstract class AbstractAlignedChunkReader extends 
AbstractChunkReader {
                 valueChunkDataBufferList.get(i).array(),
                 currentPagePosition,
                 
IUnCompressor.getUnCompressor(valueChunkHeader.getCompressionType()),
-                decrytor);
+                encryptParam);
         valueDataTypeList.add(valueChunkHeader.getDataType());
         valueDecoderList.add(
             Decoder.getDecoderByType(
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
index 0a76e2d9..3dd5aacd 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/chunk/ChunkReader.java
@@ -21,6 +21,7 @@ package org.apache.tsfile.read.reader.chunk;
 
 import org.apache.tsfile.compress.IUnCompressor;
 import org.apache.tsfile.encoding.decoder.Decoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.file.MetaMarker;
 import org.apache.tsfile.file.header.ChunkHeader;
@@ -44,7 +45,7 @@ public class ChunkReader extends AbstractChunkReader {
   private final ByteBuffer chunkDataBuffer;
   private final List<TimeRange> deleteIntervalList;
 
-  private final IDecryptor decryptor;
+  private final EncryptParameter encryptParam;
 
   @SuppressWarnings("unchecked")
   public ChunkReader(Chunk chunk, long readStopTime, Filter queryFilter) {
@@ -52,7 +53,7 @@ public class ChunkReader extends AbstractChunkReader {
     this.chunkHeader = chunk.getHeader();
     this.chunkDataBuffer = chunk.getData();
     this.deleteIntervalList = chunk.getDeleteIntervalList();
-    this.decryptor = chunk.getDecryptor();
+    this.encryptParam = chunk.getEncryptParam();
     initAllPageReaders(chunk.getChunkStatistic());
   }
 
@@ -138,7 +139,7 @@ public class ChunkReader extends AbstractChunkReader {
         new PageReader(
             pageHeader,
             new LazyLoadPageData(
-                chunkDataBuffer.array(), currentPagePosition, unCompressor, 
decryptor),
+                chunkDataBuffer.array(), currentPagePosition, unCompressor, 
encryptParam),
             chunkHeader.getDataType(),
             Decoder.getDecoderByType(chunkHeader.getEncodingType(), 
chunkHeader.getDataType()),
             defaultTimeDecoder,
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
index 301d4f0d..6021e40f 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/read/reader/page/LazyLoadPageData.java
@@ -20,6 +20,7 @@
 package org.apache.tsfile.read.reader.page;
 
 import org.apache.tsfile.compress.IUnCompressor;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IDecryptor;
 import org.apache.tsfile.file.header.PageHeader;
@@ -35,26 +36,27 @@ public class LazyLoadPageData {
 
   private final IUnCompressor unCompressor;
 
-  private final IDecryptor decryptor;
+  private final EncryptParameter encryptParam;
 
   public LazyLoadPageData(byte[] data, int offset, IUnCompressor unCompressor) 
{
     this.chunkData = data;
     this.pageDataOffset = offset;
     this.unCompressor = unCompressor;
-    this.decryptor = EncryptUtils.encrypt.getDecryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
   public LazyLoadPageData(
-      byte[] data, int offset, IUnCompressor unCompressor, IDecryptor 
decryptor) {
+      byte[] data, int offset, IUnCompressor unCompressor, EncryptParameter 
encryptParam) {
     this.chunkData = data;
     this.pageDataOffset = offset;
     this.unCompressor = unCompressor;
-    this.decryptor = decryptor;
+    this.encryptParam = encryptParam;
   }
 
   public ByteBuffer uncompressPageData(PageHeader pageHeader) throws 
IOException {
     int compressedPageBodyLength = pageHeader.getCompressedSize();
     byte[] uncompressedPageData = new byte[pageHeader.getUncompressedSize()];
+    IDecryptor decryptor = IDecryptor.getDecryptor(encryptParam);
     byte[] decryptedPageData =
         decryptor.decrypt(chunkData, pageDataOffset, compressedPageBodyLength);
     try {
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 532b01b9..9bff4b86 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
@@ -20,6 +20,7 @@ package org.apache.tsfile.write;
 
 import org.apache.tsfile.common.conf.TSFileConfig;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.exception.encrypt.EncryptException;
 import org.apache.tsfile.exception.write.ConflictDataTypeException;
@@ -72,7 +73,7 @@ public class TsFileWriter implements AutoCloseable {
   /** IO writer of this TsFile. */
   private final TsFileIOWriter fileWriter;
 
-  private IEncryptor encryptor;
+  private EncryptParameter encryptParam;
 
   private final int pageSize;
   private long recordCount = 0;
@@ -205,7 +206,7 @@ public class TsFileWriter implements AutoCloseable {
       encryptKey = null;
       dataEncryptKey = null;
     }
-    this.encryptor = IEncryptor.getEncryptor(encryptType, dataEncryptKey);
+    this.encryptParam = new EncryptParameter(encryptType, dataEncryptKey);
     if (encryptKey != null) {
       StringBuilder valueStr = new StringBuilder();
 
@@ -474,13 +475,13 @@ public class TsFileWriter implements AutoCloseable {
     IChunkGroupWriter groupWriter = groupWriters.get(deviceId);
     if (groupWriter == null) {
       if (isAligned) {
-        groupWriter = new AlignedChunkGroupWriterImpl(deviceId, encryptor);
+        groupWriter = new AlignedChunkGroupWriterImpl(deviceId, encryptParam);
         if (!isUnseq) { // Sequence File
           ((AlignedChunkGroupWriterImpl) groupWriter)
               .setLastTime(alignedDeviceLastTimeMap.getOrDefault(deviceId, 
-1L));
         }
       } else {
-        groupWriter = new NonAlignedChunkGroupWriterImpl(deviceId, encryptor);
+        groupWriter = new NonAlignedChunkGroupWriterImpl(deviceId, 
encryptParam);
         if (!isUnseq) { // Sequence File
           ((NonAlignedChunkGroupWriterImpl) groupWriter)
               .setLastTimeMap(
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
index 0c3bb701..cfc42043 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkGroupWriterImpl.java
@@ -22,8 +22,8 @@ import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.encoding.encoder.Encoder;
 import org.apache.tsfile.encoding.encoder.TSEncodingBuilder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -60,7 +60,7 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
 
   private final TimeChunkWriter timeChunkWriter;
 
-  private final IEncryptor encryptor;
+  private final EncryptParameter encryprParam;
 
   private long lastTime = -1;
 
@@ -72,11 +72,13 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
     Encoder encoder = 
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
-    timeChunkWriter = new TimeChunkWriter(timeMeasurementId, compressionType, 
tsEncoding, encoder);
+    this.encryprParam = EncryptUtils.encryptParam;
+    timeChunkWriter =
+        new TimeChunkWriter(
+            timeMeasurementId, compressionType, tsEncoding, encoder, 
this.encryprParam);
   }
 
-  public AlignedChunkGroupWriterImpl(IDeviceID deviceId, IEncryptor encryptor) 
{
+  public AlignedChunkGroupWriterImpl(IDeviceID deviceId, EncryptParameter 
encryptParam) {
     this.deviceId = deviceId;
     String timeMeasurementId = "";
     CompressionType compressionType = 
TSFileDescriptor.getInstance().getConfig().getCompressor();
@@ -84,10 +86,10 @@ public class AlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
     Encoder encoder = 
TSEncodingBuilder.getEncodingBuilder(tsEncoding).getEncoder(timeType);
-    this.encryptor = encryptor;
+    this.encryprParam = encryptParam;
     timeChunkWriter =
         new TimeChunkWriter(
-            timeMeasurementId, compressionType, tsEncoding, encoder, 
this.encryptor);
+            timeMeasurementId, compressionType, tsEncoding, encoder, 
this.encryprParam);
   }
 
   @Override
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
index 96385f33..a858e4a3 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/AlignedChunkWriterImpl.java
@@ -22,8 +22,8 @@ import org.apache.tsfile.block.column.Column;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.encoding.encoder.Encoder;
 import org.apache.tsfile.encoding.encoder.TSEncodingBuilder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.PageHeader;
@@ -48,7 +48,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter {
   protected List<ValueChunkWriter> valueChunkWriterList;
   protected int valueIndex;
 
-  protected IEncryptor encryptor;
+  protected EncryptParameter encryptParam;
 
   // Used for batch writing
   protected long remainingPointsNumber;
@@ -57,14 +57,14 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
 
   // TestOnly
   public AlignedChunkWriterImpl(VectorMeasurementSchema schema) {
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     timeChunkWriter =
         new TimeChunkWriter(
             schema.getMeasurementId(),
             schema.getCompressor(),
             schema.getTimeTSEncoding(),
             schema.getTimeEncoder(),
-            this.encryptor);
+            this.encryptParam);
 
     List<String> valueMeasurementIdList = schema.getSubMeasurementsList();
     List<TSDataType> valueTSDataTypeList = 
schema.getSubMeasurementsTSDataTypeList();
@@ -80,22 +80,22 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               valueTSDataTypeList.get(i),
               valueTSEncodingList.get(i),
               valueEncoderList.get(i),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
     this.remainingPointsNumber = 
timeChunkWriter.getRemainingPointNumberForCurrentPage();
   }
 
-  public AlignedChunkWriterImpl(VectorMeasurementSchema schema, IEncryptor 
encryptor) {
-    this.encryptor = encryptor;
+  public AlignedChunkWriterImpl(VectorMeasurementSchema schema, 
EncryptParameter encryptParam) {
+    this.encryptParam = encryptParam;
     timeChunkWriter =
         new TimeChunkWriter(
             schema.getMeasurementId(),
             schema.getCompressor(),
             schema.getTimeTSEncoding(),
             schema.getTimeEncoder(),
-            this.encryptor);
+            this.encryptParam);
 
     List<String> valueMeasurementIdList = schema.getSubMeasurementsList();
     List<TSDataType> valueTSDataTypeList = 
schema.getSubMeasurementsTSDataTypeList();
@@ -111,7 +111,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               valueTSDataTypeList.get(i),
               valueTSEncodingList.get(i),
               valueEncoderList.get(i),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
@@ -127,14 +127,14 @@ public class AlignedChunkWriterImpl implements 
IChunkWriter {
    */
   public AlignedChunkWriterImpl(
       IMeasurementSchema timeSchema, List<IMeasurementSchema> valueSchemaList) 
{
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     timeChunkWriter =
         new TimeChunkWriter(
             timeSchema.getMeasurementId(),
             timeSchema.getCompressor(),
             timeSchema.getEncodingType(),
             timeSchema.getTimeEncoder(),
-            this.encryptor);
+            this.encryptParam);
 
     valueChunkWriterList = new ArrayList<>(valueSchemaList.size());
     for (int i = 0; i < valueSchemaList.size(); i++) {
@@ -145,7 +145,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               valueSchemaList.get(i).getType(),
               valueSchemaList.get(i).getEncodingType(),
               valueSchemaList.get(i).getValueEncoder(),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
@@ -155,15 +155,15 @@ public class AlignedChunkWriterImpl implements 
IChunkWriter {
   public AlignedChunkWriterImpl(
       IMeasurementSchema timeSchema,
       List<IMeasurementSchema> valueSchemaList,
-      IEncryptor encryptor) {
-    this.encryptor = encryptor;
+      EncryptParameter encryptParam) {
+    this.encryptParam = encryptParam;
     timeChunkWriter =
         new TimeChunkWriter(
             timeSchema.getMeasurementId(),
             timeSchema.getCompressor(),
             timeSchema.getEncodingType(),
             timeSchema.getTimeEncoder(),
-            this.encryptor);
+            this.encryptParam);
 
     valueChunkWriterList = new ArrayList<>(valueSchemaList.size());
     for (int i = 0; i < valueSchemaList.size(); i++) {
@@ -174,7 +174,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               valueSchemaList.get(i).getType(),
               valueSchemaList.get(i).getEncodingType(),
               valueSchemaList.get(i).getValueEncoder(),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
@@ -189,7 +189,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
    * @param schemaList value schema list
    */
   public AlignedChunkWriterImpl(List<IMeasurementSchema> schemaList) {
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     TSEncoding timeEncoding =
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
@@ -200,7 +200,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
             timeCompression,
             timeEncoding,
             
TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType),
-            this.encryptor);
+            this.encryptParam);
 
     valueChunkWriterList = new ArrayList<>(schemaList.size());
     for (int i = 0; i < schemaList.size(); i++) {
@@ -211,7 +211,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               schemaList.get(i).getType(),
               schemaList.get(i).getEncodingType(),
               schemaList.get(i).getValueEncoder(),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
@@ -219,8 +219,9 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
     this.remainingPointsNumber = 
timeChunkWriter.getRemainingPointNumberForCurrentPage();
   }
 
-  public AlignedChunkWriterImpl(List<IMeasurementSchema> schemaList, 
IEncryptor encryptor) {
-    this.encryptor = encryptor;
+  public AlignedChunkWriterImpl(
+      List<IMeasurementSchema> schemaList, EncryptParameter encryptParam) {
+    this.encryptParam = encryptParam;
     TSEncoding timeEncoding =
         
TSEncoding.valueOf(TSFileDescriptor.getInstance().getConfig().getTimeEncoder());
     TSDataType timeType = 
TSFileDescriptor.getInstance().getConfig().getTimeSeriesDataType();
@@ -231,7 +232,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
             timeCompression,
             timeEncoding,
             
TSEncodingBuilder.getEncodingBuilder(timeEncoding).getEncoder(timeType),
-            this.encryptor);
+            this.encryptParam);
 
     valueChunkWriterList = new ArrayList<>(schemaList.size());
     for (int i = 0; i < schemaList.size(); i++) {
@@ -242,7 +243,7 @@ public class AlignedChunkWriterImpl implements IChunkWriter 
{
               schemaList.get(i).getType(),
               schemaList.get(i).getEncodingType(),
               schemaList.get(i).getValueEncoder(),
-              this.encryptor));
+              this.encryptParam));
     }
 
     this.valueIndex = 0;
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
index 09fa15f2..c886872b 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ChunkWriterImpl.java
@@ -21,8 +21,8 @@ package org.apache.tsfile.write.chunk;
 import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.SDTEncoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
@@ -52,7 +52,7 @@ public class ChunkWriterImpl implements IChunkWriter {
 
   private final ICompressor compressor;
 
-  private final IEncryptor encryptor;
+  private final EncryptParameter encryptParam;
 
   /** all pages of this chunk. */
   private final PublicBAOS pageBuffer;
@@ -103,7 +103,7 @@ public class ChunkWriterImpl implements IChunkWriter {
   public ChunkWriterImpl(IMeasurementSchema schema) {
     this.measurementSchema = schema;
     this.compressor = ICompressor.getCompressor(schema.getCompressor());
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
@@ -115,7 +115,7 @@ public class ChunkWriterImpl implements IChunkWriter {
     // init statistics for this chunk and page
     this.statistics = Statistics.getStatsByType(measurementSchema.getType());
 
-    this.pageWriter = new PageWriter(measurementSchema, encryptor);
+    this.pageWriter = new PageWriter(measurementSchema, encryptParam);
 
     this.pageWriter.setTimeEncoder(measurementSchema.getTimeEncoder());
     this.pageWriter.setValueEncoder(measurementSchema.getValueEncoder());
@@ -124,10 +124,10 @@ public class ChunkWriterImpl implements IChunkWriter {
     checkSdtEncoding();
   }
 
-  public ChunkWriterImpl(IMeasurementSchema schema, IEncryptor encryptor) {
+  public ChunkWriterImpl(IMeasurementSchema schema, EncryptParameter 
encryptParam) {
     this.measurementSchema = schema;
     this.compressor = ICompressor.getCompressor(schema.getCompressor());
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
@@ -139,7 +139,7 @@ public class ChunkWriterImpl implements IChunkWriter {
     // init statistics for this chunk and page
     this.statistics = Statistics.getStatsByType(measurementSchema.getType());
 
-    this.pageWriter = new PageWriter(measurementSchema, encryptor);
+    this.pageWriter = new PageWriter(measurementSchema, this.encryptParam);
 
     this.pageWriter.setTimeEncoder(measurementSchema.getTimeEncoder());
     this.pageWriter.setValueEncoder(measurementSchema.getValueEncoder());
@@ -153,8 +153,9 @@ public class ChunkWriterImpl implements IChunkWriter {
     this.isMerging = isMerging;
   }
 
-  public ChunkWriterImpl(IMeasurementSchema schema, boolean isMerging, 
IEncryptor encryptor) {
-    this(schema, encryptor);
+  public ChunkWriterImpl(
+      IMeasurementSchema schema, boolean isMerging, EncryptParameter 
encryptParam) {
+    this(schema, encryptParam);
     this.isMerging = isMerging;
   }
 
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
index c719dd83..197f165e 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/NonAlignedChunkGroupWriterImpl.java
@@ -19,8 +19,8 @@
 package org.apache.tsfile.write.chunk;
 
 import org.apache.tsfile.common.constant.TsFileConstant;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.WriteProcessException;
 import org.apache.tsfile.file.metadata.IDeviceID;
@@ -53,25 +53,25 @@ public class NonAlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
   /** Map(measurementID, ChunkWriterImpl). Aligned measurementId is empty. */
   private final Map<String, ChunkWriterImpl> chunkWriters = new 
LinkedHashMap<>();
 
-  private IEncryptor encryptor;
+  private EncryptParameter encryptParam;
 
   // measurementId -> lastTime
   private Map<String, Long> lastTimeMap = new HashMap<>();
 
   public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId) {
     this.deviceId = deviceId;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
-  public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId, IEncryptor 
encryptor) {
+  public NonAlignedChunkGroupWriterImpl(IDeviceID deviceId, EncryptParameter 
encryptParam) {
     this.deviceId = deviceId;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
   }
 
   @Override
   public void tryToAddSeriesWriter(IMeasurementSchema schema) {
     if (!chunkWriters.containsKey(schema.getMeasurementId())) {
-      this.chunkWriters.put(schema.getMeasurementId(), new 
ChunkWriterImpl(schema, encryptor));
+      this.chunkWriters.put(schema.getMeasurementId(), new 
ChunkWriterImpl(schema, encryptParam));
     }
   }
 
@@ -79,7 +79,7 @@ public class NonAlignedChunkGroupWriterImpl implements 
IChunkGroupWriter {
   public void tryToAddSeriesWriter(List<IMeasurementSchema> schemas) {
     for (IMeasurementSchema schema : schemas) {
       if (!chunkWriters.containsKey(schema.getMeasurementId())) {
-        this.chunkWriters.put(schema.getMeasurementId(), new 
ChunkWriterImpl(schema, encryptor));
+        this.chunkWriters.put(schema.getMeasurementId(), new 
ChunkWriterImpl(schema, encryptParam));
       }
     }
   }
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
index 32e6fbe1..c4181f51 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/TimeChunkWriter.java
@@ -22,8 +22,8 @@ import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.Encoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
@@ -55,7 +55,7 @@ public class TimeChunkWriter {
 
   private CompressionType compressionType;
 
-  private IEncryptor encryptor;
+  private EncryptParameter encryptParam;
 
   /** all pages of this chunk. */
   private PublicBAOS pageBuffer;
@@ -94,7 +94,7 @@ public class TimeChunkWriter {
     this.measurementId = measurementId;
     this.encodingType = encodingType;
     this.compressionType = compressionType;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
@@ -107,7 +107,8 @@ public class TimeChunkWriter {
     this.statistics = new TimeStatistics();
 
     this.pageWriter =
-        new TimePageWriter(timeEncoder, 
ICompressor.getCompressor(compressionType), this.encryptor);
+        new TimePageWriter(
+            timeEncoder, ICompressor.getCompressor(compressionType), 
this.encryptParam);
   }
 
   public TimeChunkWriter(
@@ -115,11 +116,11 @@ public class TimeChunkWriter {
       CompressionType compressionType,
       TSEncoding encodingType,
       Encoder timeEncoder,
-      IEncryptor encryptor) {
+      EncryptParameter encryptParam) {
     this.measurementId = measurementId;
     this.encodingType = encodingType;
     this.compressionType = compressionType;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
     this.pageBuffer = new PublicBAOS();
 
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
@@ -132,7 +133,7 @@ public class TimeChunkWriter {
     this.statistics = new TimeStatistics();
 
     this.pageWriter =
-        new TimePageWriter(timeEncoder, 
ICompressor.getCompressor(compressionType), encryptor);
+        new TimePageWriter(timeEncoder, 
ICompressor.getCompressor(compressionType), encryptParam);
   }
 
   public void write(long time) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
index 87f5b635..3a3ccfa8 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/chunk/ValueChunkWriter.java
@@ -22,8 +22,8 @@ import org.apache.tsfile.common.conf.TSFileDescriptor;
 import org.apache.tsfile.common.constant.TsFileConstant;
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.Encoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
-import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.exception.write.PageException;
 import org.apache.tsfile.file.header.ChunkHeader;
@@ -58,7 +58,7 @@ public class ValueChunkWriter {
 
   private final CompressionType compressionType;
 
-  private final IEncryptor encryptor;
+  private final EncryptParameter encryptParam;
 
   /** all pages of this chunk. */
   private final PublicBAOS pageBuffer;
@@ -97,7 +97,7 @@ public class ValueChunkWriter {
     this.encodingType = encodingType;
     this.dataType = dataType;
     this.compressionType = compressionType;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
     this.pageBuffer = new PublicBAOS();
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
     this.maxNumberOfPointsInPage =
@@ -109,7 +109,7 @@ public class ValueChunkWriter {
 
     this.pageWriter =
         new ValuePageWriter(
-            valueEncoder, ICompressor.getCompressor(compressionType), 
dataType, this.encryptor);
+            valueEncoder, ICompressor.getCompressor(compressionType), 
dataType, this.encryptParam);
   }
 
   public ValueChunkWriter(
@@ -118,12 +118,12 @@ public class ValueChunkWriter {
       TSDataType dataType,
       TSEncoding encodingType,
       Encoder valueEncoder,
-      IEncryptor encryptor) {
+      EncryptParameter encryptParam) {
     this.measurementId = measurementId;
     this.encodingType = encodingType;
     this.dataType = dataType;
     this.compressionType = compressionType;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
     this.pageBuffer = new PublicBAOS();
     this.pageSizeThreshold = 
TSFileDescriptor.getInstance().getConfig().getPageSizeInByte();
     this.maxNumberOfPointsInPage =
@@ -135,7 +135,7 @@ public class ValueChunkWriter {
 
     this.pageWriter =
         new ValuePageWriter(
-            valueEncoder, ICompressor.getCompressor(compressionType), 
dataType, encryptor);
+            valueEncoder, ICompressor.getCompressor(compressionType), 
dataType, this.encryptParam);
   }
 
   public void write(long time, long value, boolean isNull) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
index 75ebbd66..87740430 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/PageWriter.java
@@ -20,6 +20,7 @@ package org.apache.tsfile.write.page;
 
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.Encoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
@@ -50,7 +51,7 @@ public class PageWriter {
 
   private ICompressor compressor;
 
-  private IEncryptor encryptor;
+  private EncryptParameter encryptParam;
 
   // time
   private Encoder timeEncoder;
@@ -73,6 +74,7 @@ public class PageWriter {
     this(measurementSchema.getTimeEncoder(), 
measurementSchema.getValueEncoder());
     this.statistics = Statistics.getStatsByType(measurementSchema.getType());
     this.compressor = 
ICompressor.getCompressor(measurementSchema.getCompressor());
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
   private PageWriter(Encoder timeEncoder, Encoder valueEncoder) {
@@ -80,25 +82,25 @@ public class PageWriter {
     this.valueOut = new PublicBAOS();
     this.timeEncoder = timeEncoder;
     this.valueEncoder = valueEncoder;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
-  public PageWriter(IEncryptor encryptor) {
-    this(null, null, encryptor);
+  public PageWriter(EncryptParameter encryptParam) {
+    this(null, null, encryptParam);
   }
 
-  public PageWriter(IMeasurementSchema measurementSchema, IEncryptor 
encryptor) {
-    this(measurementSchema.getTimeEncoder(), 
measurementSchema.getValueEncoder(), encryptor);
+  public PageWriter(IMeasurementSchema measurementSchema, EncryptParameter 
encryptParam) {
+    this(measurementSchema.getTimeEncoder(), 
measurementSchema.getValueEncoder(), encryptParam);
     this.statistics = Statistics.getStatsByType(measurementSchema.getType());
     this.compressor = 
ICompressor.getCompressor(measurementSchema.getCompressor());
   }
 
-  private PageWriter(Encoder timeEncoder, Encoder valueEncoder, IEncryptor 
encryptor) {
+  private PageWriter(Encoder timeEncoder, Encoder valueEncoder, 
EncryptParameter encryptParam) {
     this.timeOut = new PublicBAOS();
     this.valueOut = new PublicBAOS();
     this.timeEncoder = timeEncoder;
     this.valueEncoder = valueEncoder;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
   }
 
   /** write a time value pair into encoder */
@@ -265,6 +267,8 @@ public class PageWriter {
       statistics.serialize(pageBuffer);
     }
 
+    IEncryptor encryptor = IEncryptor.getEncryptor(encryptParam);
+
     // write page content to temp PBAOS
     logger.trace("start to flush a page data into buffer, buffer position {} 
", pageBuffer.size());
     if (compressor.getType().equals(CompressionType.UNCOMPRESSED)) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
index 3b45b403..b83743ef 100644
--- a/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
+++ b/java/tsfile/src/main/java/org/apache/tsfile/write/page/TimePageWriter.java
@@ -20,6 +20,7 @@ package org.apache.tsfile.write.page;
 
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.Encoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.file.metadata.enums.CompressionType;
@@ -46,7 +47,7 @@ public class TimePageWriter {
 
   private final ICompressor compressor;
 
-  private final IEncryptor encryptor;
+  private final EncryptParameter encryptParam;
 
   // time
   private Encoder timeEncoder;
@@ -63,15 +64,16 @@ public class TimePageWriter {
     this.timeEncoder = timeEncoder;
     this.statistics = new TimeStatistics();
     this.compressor = compressor;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
-  public TimePageWriter(Encoder timeEncoder, ICompressor compressor, 
IEncryptor encryptor) {
+  public TimePageWriter(
+      Encoder timeEncoder, ICompressor compressor, EncryptParameter 
encryptParam) {
     this.timeOut = new PublicBAOS();
     this.timeEncoder = timeEncoder;
     this.statistics = new TimeStatistics();
     this.compressor = compressor;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
   }
 
   /** write a time into encoder */
@@ -151,6 +153,7 @@ public class TimePageWriter {
     // write page content to temp PBAOS
     logger.trace(
         "start to flush a time page data into buffer, buffer position {} ", 
pageBuffer.size());
+    IEncryptor encryptor = IEncryptor.getEncryptor(encryptParam);
     if (compressor.getType().equals(CompressionType.UNCOMPRESSED)) {
       if (encryptor.getEncryptionType().equals(EncryptionType.UNENCRYPTED)) {
         try (WritableByteChannel channel = Channels.newChannel(pageBuffer)) {
diff --git 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
index 629ed51b..6199171a 100644
--- 
a/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
+++ 
b/java/tsfile/src/main/java/org/apache/tsfile/write/page/ValuePageWriter.java
@@ -20,6 +20,7 @@ package org.apache.tsfile.write.page;
 
 import org.apache.tsfile.compress.ICompressor;
 import org.apache.tsfile.encoding.encoder.Encoder;
+import org.apache.tsfile.encrypt.EncryptParameter;
 import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.encrypt.IEncryptor;
 import org.apache.tsfile.enums.TSDataType;
@@ -48,7 +49,7 @@ public class ValuePageWriter {
 
   private final ICompressor compressor;
 
-  private final IEncryptor encryptor;
+  private final EncryptParameter encryptParam;
 
   // value
   private Encoder valueEncoder;
@@ -76,11 +77,14 @@ public class ValuePageWriter {
     this.valueEncoder = valueEncoder;
     this.statistics = Statistics.getStatsByType(dataType);
     this.compressor = compressor;
-    this.encryptor = EncryptUtils.encrypt.getEncryptor();
+    this.encryptParam = EncryptUtils.encryptParam;
   }
 
   public ValuePageWriter(
-      Encoder valueEncoder, ICompressor compressor, TSDataType dataType, 
IEncryptor encryptor) {
+      Encoder valueEncoder,
+      ICompressor compressor,
+      TSDataType dataType,
+      EncryptParameter encryptParam) {
     this.valueOut = new PublicBAOS();
     this.bitmap = 0;
     this.size = 0;
@@ -88,7 +92,7 @@ public class ValuePageWriter {
     this.valueEncoder = valueEncoder;
     this.statistics = Statistics.getStatsByType(dataType);
     this.compressor = compressor;
-    this.encryptor = encryptor;
+    this.encryptParam = encryptParam;
   }
 
   /** write a time value pair into encoder */
@@ -306,7 +310,7 @@ public class ValuePageWriter {
       ReadWriteForEncodingUtils.writeUnsignedVarInt(compressedSize, 
pageBuffer);
       statistics.serialize(pageBuffer);
     }
-
+    IEncryptor encryptor = IEncryptor.getEncryptor(encryptParam);
     // write page content to temp PBAOS
     logger.trace("start to flush a page data into buffer, buffer position {} 
", pageBuffer.size());
     if (compressor.getType().equals(CompressionType.UNCOMPRESSED)) {
diff --git 
a/java/tsfile/src/test/java/org/apache/tsfile/read/UnClosedTsFileReaderTest.java
 
b/java/tsfile/src/test/java/org/apache/tsfile/read/UnClosedTsFileReaderTest.java
index cc022fbc..62dc9bda 100644
--- 
a/java/tsfile/src/test/java/org/apache/tsfile/read/UnClosedTsFileReaderTest.java
+++ 
b/java/tsfile/src/test/java/org/apache/tsfile/read/UnClosedTsFileReaderTest.java
@@ -20,7 +20,6 @@
 package org.apache.tsfile.read;
 
 import org.apache.tsfile.constant.TestConstant;
-import org.apache.tsfile.encrypt.EncryptUtils;
 import org.apache.tsfile.enums.TSDataType;
 import org.apache.tsfile.file.metadata.ChunkMetadata;
 import org.apache.tsfile.file.metadata.IDeviceID.Factory;
@@ -48,7 +47,7 @@ public class UnClosedTsFileReaderTest {
     TsFileIOWriter writer = new TsFileIOWriter(file);
     writer.startChunkGroup(Factory.DEFAULT_FACTORY.create("root.sg1.d1"));
     ChunkWriterImpl chunkWriter =
-        new ChunkWriterImpl(new MeasurementSchema("s1", TSDataType.INT64), 
EncryptUtils.encryptor);
+        new ChunkWriterImpl(new MeasurementSchema("s1", TSDataType.INT64));
     chunkWriter.write(1, 1L);
     chunkWriter.write(2, 2L);
     chunkWriter.write(3, 3L);

Reply via email to