All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.biuqu.encryptor.BaseEncryptorFacade Maven / Gradle / Ivy

The newest version!
package com.biuqu.encryptor;

import com.biuqu.encryptor.factory.EncryptorFactory;
import com.biuqu.encryptor.model.EncryptorKey;
import com.biuqu.encryptor.model.EncryptorKeys;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 抽象的加密器门面
 * 

* 业务场景说明: * 1.场景一:用于与外部加密交互(只能使用本地生成的秘钥来做加密、摘要和签名,以及逆过程),参见com.biuqu.security; * 2.场景二:用于内部数据的加密交互(为了安全起见,一般使用加密机来做本地数据的加密、摘要和签名,以及逆过程),参见com.biuqu.hsm; *

* 场景一(本地加密)的使用说明: * 1.在加密算法的基础上,只封装实现了2套常用和安全的加密器:国际加密器和国密加密器; * 2.加密器门面从使用场景出发,只解决加密器的常规使用,如:区分加密器的加密和解密,举例说明: * a.有用户A(客户端)使用加密器和己方(服务端)对接,同时己方(客户端)再使用加密器和B方(服务端)对接,假设都使用GM(国密复合算法); * b.己方作为A的服务端,则需要存储1组公私钥(己方私钥1,A方公钥)用于与A的验签和解密(只会调用这两个方法); * c.己方作为B的客户端,则需要存储另1组公私钥(己方私钥2,B方公钥)用于与B的加密和加签(只会调用这两个方法); * 综上,复合加密算法的多秘钥场景下(对应双向加密和签名),实际上也只会使用己方私钥和另一方公钥,与加密算法类的使用不同; * 同理可推出,非对称秘钥的单加密算法的的场景下也是仅限保留1组公私钥(己方私钥3,对方公钥): * 公钥不存在时,表示单向加密和验签(己方为服务端); * 私钥不存在时,表示单向加密和验签(己方为客户端); *

* 场景二(加密机加密)的使用说明: * 1.秘钥不外发,适合做内部数据的加解密,如隐私的数据库数据、文件,一般是存储加密(摘要签名),使用解密(摘要验签); * 2.针对场景一(本地加密)使用的本地秘钥,也属于重要隐私数据,需要使用加密机做存储加密,使用解密,一般会做成秘钥管理器,我这里简化下,只做秘钥加解密; * * @author BiuQu * @date 2023/5/3 09:58 */ public abstract class BaseEncryptorFacade implements EncryptorFacade { public BaseEncryptorFacade(EncryptorKeys keys) { //初始化所有配置的加密器(根据自定义的名称来初始化,同一类的加密算法可以有多个) for (EncryptorKey key : keys.getKeys()) { String algorithm = key.getAlgorithm(); Encryptor encryptor = EncryptorFactory.newEncryptor(algorithm, key); String algorithmName = key.getName(); if (null == algorithmName) { algorithmName = algorithm; } if (null != encryptor) { ENCRYPTOR_MAP.put(algorithmName, encryptor); ENCRYPTOR_KEY_MAP.put(algorithmName, key); } } } /** * 获取加密器 * * @param name 加密器的唯一名称 * @return 对称加密器 */ public T getEncryptor(String name) { return (T)ENCRYPTOR_MAP.get(name); } /** * 创建加密器 * * @param name 加密器的唯一名称 * @return 加密器 */ public T createEncryptor(String name) { Encryptor encryptor = null; EncryptorKey key = ENCRYPTOR_KEY_MAP.get(name); if (null != key) { encryptor = EncryptorFactory.newEncryptor(name, key); } return (T)encryptor; } /** * 加密器的集合 */ private static final Map ENCRYPTOR_MAP = new ConcurrentHashMap<>(); /** * 加密器的参数配置集合 */ private static final Map ENCRYPTOR_KEY_MAP = new ConcurrentHashMap<>(); }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy