perf(security/crypto): 获取加密算法增加缓存

This commit is contained in:
2024-02-09 17:44:59 +08:00
parent b604f2fc7e
commit 74a1166b5f
2 changed files with 81 additions and 14 deletions

View File

@@ -0,0 +1,77 @@
/*
* Copyright (c) 2022-present Charles7c Authors. All Rights Reserved.
* <p>
* Licensed under the GNU LESSER GENERAL PUBLIC LICENSE 3.0;
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* <p>
* http://www.gnu.org/licenses/lgpl.html
* <p>
* 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 top.charles7c.continew.starter.security.crypto.encryptor;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import top.charles7c.continew.starter.core.constant.StringConstants;
import java.nio.charset.StandardCharsets;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 对称加/解密处理器
*
* @author Charles7c
* @since 1.4.0
*/
public abstract class AbstractSymmetricCryptoEncryptor implements IEncryptor {
private static final Map<String, SymmetricCrypto> CACHE = new ConcurrentHashMap<>();
@Override
public String encrypt(String plaintext, String password, String publicKey) throws Exception {
if (StrUtil.isBlank(plaintext)) {
return plaintext;
}
return this.getCrypto(password).encryptHex(plaintext);
}
@Override
public String decrypt(String ciphertext, String password, String privateKey) throws Exception {
if (StrUtil.isBlank(ciphertext)) {
return ciphertext;
}
return this.getCrypto(password).decryptStr(ciphertext);
}
/**
* 获取对称加密算法
*
* @param password 密钥
* @return 对称加密算法
*/
protected SymmetricCrypto getCrypto(String password) {
SymmetricAlgorithm algorithm = this.getAlgorithm();
String key = algorithm + StringConstants.UNDERLINE + password;
if (CACHE.containsKey(key)) {
return CACHE.get(key);
}
SymmetricCrypto symmetricCrypto = new SymmetricCrypto(algorithm, password.getBytes(StandardCharsets.UTF_8));
CACHE.put(key, symmetricCrypto);
return symmetricCrypto;
}
/**
* 获取对称加密算法类型
*
* @return 对称加密算法类型
*/
protected abstract SymmetricAlgorithm getAlgorithm();
}

View File

@@ -16,10 +16,7 @@
package top.charles7c.continew.starter.security.crypto.encryptor;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import java.nio.charset.StandardCharsets;
import cn.hutool.crypto.symmetric.SymmetricAlgorithm;
/**
* AESAdvanced Encryption Standard 加/解密处理器
@@ -30,17 +27,10 @@ import java.nio.charset.StandardCharsets;
* @author Charles7c
* @since 1.4.0
*/
public class AesEncryptor implements IEncryptor {
public class AesEncryptor extends AbstractSymmetricCryptoEncryptor {
@Override
public String encrypt(String plaintext, String password, String publicKey) throws Exception {
AES aes = SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8));
return aes.encryptHex(plaintext);
}
@Override
public String decrypt(String ciphertext, String password, String privateKey) throws Exception {
AES aes = SecureUtil.aes(password.getBytes(StandardCharsets.UTF_8));
return aes.decryptStr(ciphertext);
protected SymmetricAlgorithm getAlgorithm() {
return SymmetricAlgorithm.AES;
}
}