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

使用加密字段的Spring boot MongoDB

苍温文
2023-03-14
@Document(collection = "user_data")
public class UserData {
 @Id
 private String id;
 @Field("is_active")
 private Boolean isActive;
 @Field("organization_id")
 private String organizationId;
 @Field("system_mode")
 private SystemMode systemMode;
 @Field("first_name")
 private String firstName;
 @Field("last_name")
 private String lastName;
}

*还有构造函数、getter和setter,但为了简单起见,我省略了它们。

我还有一个匹配的存储库:

@Repository
  public interface UsersDataRepository extends MongoRepository<UserData, String> {
}

现在,字段firstName和lastName实际上已经加密,并作为二进制类型存储在数据库中。

Optional<UserData> optionalUserData = usersDataRepository.findById(userId);

共有1个答案

须鸿祯
2023-03-14

我遵循了这一指南,并为我的案例找到了一个有效的解决方案:https://blog.contactsunny.com/tech/encrypting-and-decrypting-data-in-mongoDB-with-a-springboot-project

简而言之,创建一个处理加密和解密字段的组件。创建两个事件侦听器类,它们将侦听mongo、save和get数据库事件。

我的MongoDBAfterLoadEventListener是这样结束的,请注意,它目前只适用于字符串:

public class MongoDBAfterLoadEventListener extends AbstractMongoEventListener<Object> {

    @Autowired
    private EncryptionUtil encryptionUtil;

    @Override
    public void onAfterLoad(AfterLoadEvent<Object> event) {

        Document eventObject = event.getDocument();
        
        List<String> keysToDecrypt = encryptionUtil.ENCRYPTED_FIELDS_MAP.get(event.getCollectionName());
        
        if (keysToDecrypt == null || keysToDecrypt.isEmpty()) {
            return;
        }

        for (String key : eventObject.keySet()) {
            if (keysToDecrypt.contains(key)) {
                Binary encrypted = (Binary) eventObject.get(key);
                BsonBinary bsonBinary = new BsonBinary(encrypted.getData());
                BsonValue decrypted = this.encryptionUtil.decryptText(bsonBinary);
                eventObject.put(key, decrypted.asString().getValue());
            }
        }

        super.onAfterLoad(event);
    }
}
 类似资料:
  • 我想使用chacha20解密和加密字符串 BouncyCastleProvider正在使用chacha20技术。所以我包括了罐子。并尝试了代码,但无法工作。 pbe.java

  • 问题内容: 我被要求 对db中的各个db字段 进行 加密 。 问题是这些字段在读取后需要解密。 我正在使用 Django 和 SQL Server 2005 。 有什么好主意吗? 问题答案: 是的。告诉任何告诉你真实的人。没有道理/没有道理。如果是关于存储的值的,那么企业版2008可以存储加密的DB文件。 否则,如果您真的需要(具有所有缺点),只需对其进行加密并将其存储为字节字段。

  • 在PHP中,< code > MCRYPT _ get _ iv _ size(MCRYPT _ RIJNDAEL _ 256,MCRYPT _ MODE _ CBC);返回值32,因此显然表明AES-256需要32字节的初始化向量。但这是骗人的,正如< code>mcrypt_encrypt的注释中所说: 此外,不是AES-256,它是Rijndael分组密码的不同变体。如果您想要在mcrypt

  • 本文向大家介绍.net core使用MD5加密解密字符串,包括了.net core使用MD5加密解密字符串的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了.net core使用MD5加密解密字符串的具体代码,供大家参考,具体内容如下 调用加密 解密看效果 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 我的代码如下: 有人来帮我吗