Skip to content

Commit b1ab9b3

Browse files
authored
encrypt key generate and destroy (#16176)
* add save encrypt parameter to common config * add user_encrypt_token_hint * delete the save_encrypt_key parameter * update tsfile version * set key to zero when exiting datanode * remove some noted code
1 parent 8e9c434 commit b1ab9b3

8 files changed

Lines changed: 73 additions & 26 deletions

File tree

integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppCommonConfig.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,12 +103,6 @@ public CommonConfig setEncryptType(String encryptType) {
103103
return this;
104104
}
105105

106-
@Override
107-
public CommonConfig setEncryptKeyPath(String encryptKeyPath) {
108-
setProperty("encrypt_key_path", encryptKeyPath);
109-
return this;
110-
}
111-
112106
@Override
113107
public CommonConfig setEnableGrantOption(boolean enableGrantOption) {
114108
setProperty("enable_grant_option", String.valueOf(enableGrantOption));

integration-test/src/main/java/org/apache/iotdb/it/env/cluster/config/MppSharedCommonConfig.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -82,13 +82,6 @@ public CommonConfig setEncryptType(String encryptType) {
8282
return this;
8383
}
8484

85-
@Override
86-
public CommonConfig setEncryptKeyPath(String encryptKeyPath) {
87-
cnConfig.setProperty("encrypt_key_path", encryptKeyPath);
88-
dnConfig.setProperty("encrypt_key_path", encryptKeyPath);
89-
return this;
90-
}
91-
9285
@Override
9386
public CommonConfig setEnableGrantOption(boolean enableGrantOption) {
9487
cnConfig.setEnableGrantOption(enableGrantOption);

integration-test/src/main/java/org/apache/iotdb/it/env/remote/config/RemoteCommonConfig.java

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@ public CommonConfig setEncryptType(String encryptType) {
5959
return this;
6060
}
6161

62-
@Override
63-
public CommonConfig setEncryptKeyPath(String encryptKeyPath) {
64-
return this;
65-
}
66-
6762
@Override
6863
public CommonConfig setEnableGrantOption(boolean enableGrantOption) {
6964
return this;

integration-test/src/main/java/org/apache/iotdb/itbase/env/CommonConfig.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,6 @@ public interface CommonConfig {
3838

3939
CommonConfig setEncryptType(String encryptType);
4040

41-
CommonConfig setEncryptKeyPath(String encryptKeyPath);
42-
4341
CommonConfig setEnableGrantOption(boolean enableGrantOption);
4442

4543
CommonConfig setConfigRegionRatisRPCLeaderElectionTimeoutMaxMs(int maxMs);

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/conf/IoTDBStartCheck.java

Lines changed: 55 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.apache.iotdb.db.storageengine.rescon.disk.DirectoryChecker;
3131

3232
import org.apache.commons.io.FileUtils;
33+
import org.apache.tsfile.common.conf.TSFileConfig;
3334
import org.apache.tsfile.common.conf.TSFileDescriptor;
3435
import org.apache.tsfile.encrypt.EncryptUtils;
3536
import org.apache.tsfile.exception.encrypt.EncryptException;
@@ -78,7 +79,8 @@ public class IoTDBStartCheck {
7879
private static final String SCHEMA_REGION_CONSENSUS_PORT = "dn_schema_region_consensus_port";
7980
private static final String DATA_REGION_CONSENSUS_PORT = "dn_data_region_consensus_port";
8081
private static final String ENCRYPT_MAGIC_STRING = "encrypt_magic_string";
81-
82+
private static final String ENCRYPT_SALT = "encrypt_salt";
83+
private static final String ENCRYPT_TOKEN_HINT = "encrypt_token_hint";
8284
private static final String magicString = "thisisusedfortsfileencrypt";
8385

8486
// Mutable system parameters
@@ -316,11 +318,32 @@ public void serializeEncryptMagicString() throws IOException {
316318
throw new EncryptException(
317319
"encryptType is not UNENCRYPTED, but user_encrypt_token is not set. Please set it in the environment variable.");
318320
}
321+
String tokenHint = System.getenv("user_encrypt_token_hint");
322+
if (tokenHint != null && !tokenHint.trim().isEmpty()) {
323+
// If user_encrypt_token_hint is set, it should follow some rules.
324+
// For example, it could not include user_encrypt_token.
325+
if (tokenHint.toLowerCase().contains(token.toLowerCase())) {
326+
throw new EncryptException(
327+
"user_encrypt_token_hint should not include user_encrypt_token, please check it in your environment variable.");
328+
}
329+
if (tokenHint
330+
.toLowerCase()
331+
.contains(new StringBuilder(token.toLowerCase()).reverse().toString())) {
332+
throw new EncryptException(
333+
"user_encrypt_token_hint should not include the reverse of user_encrypt_token, please check it in your environment variable.");
334+
}
335+
}
319336
}
320337
String encryptMagicString =
321338
EncryptUtils.byteArrayToHexString(
322-
TSFileDescriptor.getInstance().getConfig().getEncryptKey());
339+
EncryptUtils.getEncrypt().getEncryptor().encrypt(magicString.getBytes()));
323340
systemProperties.put(ENCRYPT_MAGIC_STRING, () -> encryptMagicString);
341+
String encryptSalt =
342+
EncryptUtils.byteArrayToHexString(
343+
TSFileDescriptor.getInstance().getConfig().getEncryptSalt());
344+
systemProperties.put(ENCRYPT_SALT, () -> encryptSalt);
345+
String encryptTokenHint = CommonDescriptor.getInstance().getConfig().getUserEncryptTokenHint();
346+
systemProperties.put(ENCRYPT_TOKEN_HINT, () -> encryptTokenHint);
324347
generateOrOverwriteSystemPropertiesFile();
325348
}
326349

@@ -360,10 +383,36 @@ public void generateOrOverwriteSystemPropertiesFile() throws IOException {
360383

361384
public void checkEncryptMagicString() throws IOException, ConfigurationException {
362385
properties = systemPropertiesHandler.read();
363-
String encryptMagicString = properties.getProperty("encrypt_magic_string");
364-
if (encryptMagicString != null) {
365-
byte[] magicBytes = EncryptUtils.hexStringToByteArray(encryptMagicString);
366-
TSFileDescriptor.getInstance().getConfig().setEncryptKey(magicBytes);
386+
CommonDescriptor.getInstance()
387+
.getConfig()
388+
.setUserEncryptTokenHint(properties.getProperty(ENCRYPT_TOKEN_HINT));
389+
String encryptSalt = properties.getProperty(ENCRYPT_SALT);
390+
byte[] saltBytes = EncryptUtils.hexStringToByteArray(encryptSalt);
391+
TSFileDescriptor.getInstance().getConfig().setEncryptSalt(saltBytes);
392+
393+
if (!Objects.equals(TSFileDescriptor.getInstance().getConfig().getEncryptType(), "UNENCRYPTED")
394+
&& !Objects.equals(
395+
TSFileDescriptor.getInstance().getConfig().getEncryptType(),
396+
"org.apache.tsfile.encrypt.UNENCRYPTED")) {
397+
String token = System.getenv("user_encrypt_token");
398+
if (token == null || token.trim().isEmpty()) {
399+
throw new EncryptException(
400+
"restart system after not storing key, but user_encrypt_token is not set. Please set it in the environment variable before restart. Here is your token hint info: "
401+
+ CommonDescriptor.getInstance().getConfig().getUserEncryptTokenHint());
402+
}
403+
TSFileDescriptor.getInstance().getConfig().setEncryptKeyFromToken(token);
404+
}
405+
String encryptMagicString = properties.getProperty(ENCRYPT_MAGIC_STRING);
406+
byte[] magicStringBytes = EncryptUtils.hexStringToByteArray(encryptMagicString);
407+
String decryptedMagicString =
408+
new String(
409+
EncryptUtils.getEncrypt().getDecryptor().decrypt(magicStringBytes),
410+
TSFileConfig.STRING_CHARSET);
411+
if (!Objects.equals(decryptedMagicString, magicString)) {
412+
logger.error("encrypt_magic_string is not matched");
413+
throw new ConfigurationException(
414+
"Changing encrypt type or key for tsfile encryption after first start is not permitted. Here is your token hint info: "
415+
+ CommonDescriptor.getInstance().getConfig().getUserEncryptTokenHint());
367416
}
368417
}
369418
}

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNodeShutdownHook.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.apache.iotdb.rpc.TSStatusCode;
4444

4545
import org.apache.thrift.TException;
46+
import org.apache.tsfile.common.conf.TSFileDescriptor;
4647
import org.slf4j.Logger;
4748
import org.slf4j.LoggerFactory;
4849

@@ -156,6 +157,9 @@ public void run() {
156157
// Shutdown all consensus pipe's receiver
157158
PipeDataNodeAgent.receiver().pipeConsensus().closeReceiverExecutor();
158159

160+
// set encryption key to 16-byte zero.
161+
TSFileDescriptor.getInstance().getConfig().setEncryptKey(new byte[16]);
162+
159163
// Actually stop all services started by the DataNode.
160164
// If we don't call this, services like the RestService are not stopped and I can't re-start
161165
// it.

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -415,6 +415,8 @@ public class CommonConfig {
415415

416416
private volatile Pattern trustedUriPattern = Pattern.compile("file:.*");
417417

418+
private String userEncryptTokenHint = "not set yet";
419+
418420
private boolean enforceStrongPassword = false;
419421
private long passwordExpirationDays = -1;
420422
// an old password cannot be reused within the given interval if >= 0.
@@ -461,6 +463,16 @@ public void setEncryptDecryptProviderParameter(String encryptDecryptProviderPara
461463
this.encryptDecryptProviderParameter = encryptDecryptProviderParameter;
462464
}
463465

466+
public void setUserEncryptTokenHint(String userEncryptTokenHint) {
467+
if (userEncryptTokenHint != null && !userEncryptTokenHint.isEmpty()) {
468+
this.userEncryptTokenHint = userEncryptTokenHint;
469+
}
470+
}
471+
472+
public String getUserEncryptTokenHint() {
473+
return userEncryptTokenHint;
474+
}
475+
464476
public String getOpenIdProviderUrl() {
465477
return openIdProviderUrl;
466478
}

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/conf/CommonDescriptor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ public void loadCommonProps(TrimProperties properties) throws IOException {
9090
"iotdb_server_encrypt_decrypt_provider_parameter",
9191
config.getEncryptDecryptProviderParameter()));
9292

93+
config.setUserEncryptTokenHint(System.getenv("user_encrypt_token_hint"));
94+
9395
config.setEnableGrantOption(
9496
Boolean.parseBoolean(
9597
properties.getProperty("enable_grant_option", String.valueOf("true"))));

0 commit comments

Comments
 (0)