当前位置: 首页 > 知识库问答 >
问题:

java - Mybatis plus 多字段如何加密不同密码?

容宏逸
2024-01-09

User对象

public class User {    @TableField(typeHandler = EncryptTypeHandler.class)    private String password;        @TableField(typeHandler = EncryptTypeHandler.class)    private String mobile;}

加密方法

public class EncryptTypeHandler extends BaseTypeHandler<String> {    private static AES aes;}

项目中加密字段比较多,如上User对象密码和手机号的加密密钥不一样
希望一个密钥对应一个AES,不想频繁的创建AES对象,如何封装这个逻辑

共有1个答案

易祖鹤
2024-01-09

对于这个问题,你可以使用一个 Map 数据结构来存储每个字段对应的加密密钥。这样,你就可以为每个字段创建一个单独的 AES 实例,而不是为整个项目创建一个。

以下是一个可能的实现:

import org.apache.ibatis.type.BaseTypeHandler;import org.apache.ibatis.type.JdbcType;import org.apache.ibatis.type.MappedTypes;import org.apache.ibatis.type.TypeHandler;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.sql.CallableStatement;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import java.util.HashMap;import java.util.Map;@MappedTypes(String.class)public class EncryptTypeHandler extends BaseTypeHandler<String> {    private static final String AES = "AES";    private static final String SECRET_KEY = "mySecretKey"; // 默认的密钥,你可以根据需要更改    private static final String CIPHER_MODE = "AES/ECB/PKCS5Padding"; // 默认的加密模式,你可以根据需要更改    private static final Map<String, Cipher> CIPHERS = new HashMap<>(); // 存储每个字段对应的加密实例    static {        // 初始化所有的 Cipher 实例        initCiphers();    }    private static void initCiphers() {        // 这里你可以根据需要添加更多的字段和对应的密钥        String[] fields = {"password", "mobile"}; // 你可以根据需要添加更多的字段        String[] keys = {"passwordKey", "mobileKey"}; // 你可以根据需要添加更多的密钥        for (int i = 0; i < fields.length; i++) {            try {                Cipher cipher = Cipher.getInstance(CIPHER_MODE);                SecretKeySpec key = new SecretKeySpec(keys[i].getBytes(), AES);                cipher.init(Cipher.ENCRYPT_MODE, key);                CIPHERS.put(fields[i], cipher);            } catch (Exception e) {                throw new RuntimeException("Failed to initialize cipher for field " + fields[i], e);            }        }    }    @Override    public void setNonNullParameter(PreparedStatement ps, int i, String parameter, JdbcType jdbcType) throws SQLException {        ps.setString(i, encrypt(parameter, CIPHERS.get(parameter))); // 使用对应字段的 Cipher 进行加密    }    @Override    public String getNullableResult(ResultSet rs, String columnName) throws SQLException {        return decrypt(rs.getString(columnName), CIPHERS.get(columnName)); // 使用对应字段的 Cipher 进行解密    }    @Override    public String getNullableResult(ResultSet rs, int columnIndex) throws SQLException {        return decrypt(rs.getString(columnIndex), CIPHERS.get(columnIndex)); // 使用对应字段的 Cipher 进行解密    }    @Override    public String getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {        return decrypt(cs.getString(columnIndex), CIPHERS.get(columnIndex)); // 使用对应字段的 Cipher 进行解密    }}
 类似资料:
  • 问题内容: 我正在使用此代码在Java和Android中加密和解密某些字符串,并且在每个系统中,我得到一个不同的值。 我使用的代码来自http://www.androidsnippets.com/encryptdecrypt- strings (我不会粘贴它,因为它很大)。 例如,在Android中用于加密“ aa”的代码如下:1C6BD31C57F42ACFD0EDD2DD5B7A92CA 和与

  • 问题内容: 我正在尝试学习如何使用Java进行基于密码的加密。我在网上找到了几个示例,但在Stack Overflow上还没有(到目前为止)。这些示例对我的解释不大,尤其是在算法选择方面。似乎有很多传递字符串来说明要使用什么算法,但是很少有关于字符串来自何处以及含义的文档。而且似乎不同的算法可能需要KeySpec类的不同实现,所以我不确定哪种算法可以使用我正在查看的PBEKeySpec类。此外,所

  • 问题内容: 我们遇到了一种奇怪的情况,尽管我们在Java中使用的加密方法在配置上看起来完全相同,但它们生成的输出却与openssl不同。 使用相同的键和IV,文本“快速的棕狐狸跳过了懒狗!” 加密为base64的字符串… openssl: Java: 这是我们的openssl电话… 这是我们的Java … oopenssl输出 Java输出 我们缺少明显的东西吗?还是存在一些隐藏的复杂性? 问题答

  • 我们遇到了一个奇怪的情况,我们在Java中使用的加密方法产生了与openssl不同的输出,尽管它们在配置上看起来相同。 使用相同的键和IV,文本“敏捷的棕色狐狸跳过懒惰的狗!”加密到base64的字符串。。。 openssl: Java: 我们错过了什么明显的东西吗?还是有一些隐藏的复杂性?

  • 问题内容: 我需要加密的字符串会显示在2D条码中(PDF-417),所以当有人知道扫描的想法时,它就不会可读。 其他需求: 不应该复杂 它不应包含RSA,PKI基础结构,密钥对等。 它必须足够简单,以摆脱被监视的人,并且必须易于对其他有兴趣获取该数据的公司解密。他们打电话给我们,我们告诉他们标准,或者给他们一些简单的密钥,然后可以将其用于解密。 那些公司可能会使用不同的技术,因此最好坚持不依赖于某

  • 问题内容: 我的意思是: 也许像: 在PHP中,您该怎么做? 尝试使用 ,但对我不起作用。 问题答案: 更新 PHP 7就绪版本。它使用PHP OpenSSL库中的openssl_encrypt函数。