当前位置: 首页 > 面试题库 >

数据库的Hibernate加密对应用程序完全透明

席银龙
2023-03-14
问题内容

我正在一个Grails 1.0.4项目中工作,该项目必须在不到2周的时间内发布,并且客户刚提出一个要求,即应该加密数据库中的所有数据。

由于对应用程序本身中的每个数据库访问进行加密可能会花费大量时间,并且容易出错,因此我寻求的解决方案是对应用程序透明的某种加密。

有没有一种方法可以将Hibernate设置为加密所有表中的所有数据(可能不包括id和version列),还是应该寻求MySQL解决方案(我们使用的是MySQL
5.0)?

编辑:感谢您为替代解决方案提供的所有帖子,如果客户改变主意,那将是很好的。到目前为止,要求是“数据库中没有纯文本”。

我想指出的第二件事是,我正在使用Grails,对于那些不熟悉它的人,这是对配置的约定,因此即使对应用程序进行的较小更改也应避免约定。


问题答案:

自从我问了这个问题以来已经有很长时间了。同时,感谢您的所有回答。当处理最初加密整个数据库的想法时,它们很棒,但是要求变为只加密敏感的用户信息,例如名称和地址。因此解决方案类似于下面的代码。

我们已经实现了一个加密器,该加密器从记录中读取加密方法(因此每个记录可以有不同的加密),并使用它来将瞬态重复字段与数据库中加密的字段连接起来。增加的红利/缺点是:

  • 数据也在内存中进行了加密,因此对方法getFirstName的每次访问都会解密数据(我想有一种缓存已解密数据的方法,但在这种情况下我不需要)
  • 加密的字段不能与默认的grails / hibernate方法一起使用来搜索数据库,我们已经在服务中创建了自定义方法来获取数据,对其进行加密,然后在查询的where子句中使用加密的数据。使用User.withCriteria时很容易

类用户{

    byte[] encryptedFirstName
byte[] encryptedLastName
byte[] encryptedAddress

Date dateCreated // automatically set date/time when created
Date lastUpdated // automatically set date/time when last updated

EncryptionMethod encryptionMethod = ConfigurationHolder.config.encryption.method

def encrypter = Util.encrypter

static transients = [ 
'firstName', 
'lastName', 
'address',
'encrypter'
]

static final Integer BLOB_SIZE = 1024

static constraints = {

    encryptedFirstName maxSize: BLOB_SIZE, nullable: false
    encryptedLastName maxSize: BLOB_SIZE, nullable: false

    encryptedAddress maxSize: BLOB_SIZE, nullable: true

    encryptionMethod nullable: false

} // constraints

String getFirstName(){
    decrypt('encryptedFirstName')
}

void setFirstName(String item){     
    encrypt('encryptedFirstName',item)
}

String getLastName(){
    decrypt('encryptedLastName')
}

void setLastName(String item){
    encrypt('encryptedLastName',item)       
}

String getAddress(){
    decrypt('encryptedAddress')
}

void setAddress(String item){
    encrypt('encryptedAddress',item)        
}

byte[] encrypt(String name, String value) {

    if( null == value ) {
        log.debug "null string to encrypt for '$name', returning null"
        this.@"$name" = null
        return
    }

    def bytes = value.getBytes(encrypter.ENCODING_CHARSET)
    def method = getEncryptionMethod()


    byte[] res

    try {
        res = encrypter.encrypt( bytes, method )            
    } catch(e) {
        log.warn "Problem encrypting '$name' data: '$string'", e
    }

    log.trace "Encrypting '$name' with '$method' -> '${res?.size()}' bytes"

    this.@"$name" = res

}

String decrypt(String name) {

    if(null == this.@"$name") {
        log.debug "null bytes to decrypt for '$name', returning null"
        return null
    }

    def res 
    def method = getEncryptionMethod()

    try {
        res = new String(encrypter.decrypt(this.@"$name", method), encrypter.ENCODING_CHARSET )
    } catch(e) {
        log.error "Problem decrypting '$name'", e
    }

    log.trace "Decrypting '$name' with '$method' -> '${res?.size()}' bytes"

    return res
}

}



 类似资料:
  • 好的,我想知道我目前加密网络连接的方法(将在下面几行中解释)是安全有效的。 此外,我还试图记住,我希望使用尽可能少的字节(传输),因为这可能用于Android。 我目前的方法是使用两种加密方法:RSA(keysize=512)和AES(keysize=128) 我所做的是: 服务器生成RSA公钥和私钥 当客户端连接时,服务器向客户端发送公钥RSA 客户端生成AES密钥,并使用服务器提供的公共RSA

  • 问题内容: 我怀疑对于Web应用程序(JSP,Servlet,Hibernate,MySQL)是否安全,在Web应用程序中“不同的用户”可以一次获得数千次访问。 我担心的原因如下。 想象一下,我有一个针对学校学生的Web应用程序。他们有自己的个人资料,并将维护自己的学生课程,成绩等。现在,肯定有1个以上的用户将始终使用自己的个人资料在线。这意味着,如果用户对其数学标记进行了编辑,则将在用户的个人资

  • 一对亚马逊lambda会对称地加密和解密一小块应用数据。我想用亚马逊KMS来方便这一点,因为它解决了秘密存储和密钥旋转的问题,然后一些。 Amazon KMS开发人员指南指出: 这些操作是为了加密和解密数据密钥而设计的。他们在加密操作中使用AWS KMS客户主密钥(CMK),并且不能接受超过4 KB(4096字节)的数据。虽然您可以使用它们来加密少量数据(如密码或RSA密钥),但它们并不是为加密应

  • 这可能已经有人回答或问了,但我无法找到一个满足我的用例。通过在application.properties文件中指定以下属性,我正在spring boot web应用程序(注意:我的应用程序打包为“war”,它不包含嵌入的tomcat)中建立数据库连接。 我正在获得加密的一个“ilwjvmfqopxvbyue17zn6hx8mljngiuu”,并将其放置在属性文件中,如下所示 但是spring无法

  • Microsoft Excel 的功能真的可以用博大精深来形容。特别是自Excel 2007 在原有的基础上又增加了一些更简单易用的功能。 特别是数据透视表功能,更被认为是Excel 的精华所在。 本文从创建数据透视表到使用数据透视表查看、汇总、分析数据,还包括数据透视表的布局控制,数据透视表的数据源更新与链接等功能都做了详尽的介绍。

  • Weblogic是否有任何免费可用的应用程序(war文件),其中应用程序使用某种数据库? 如果这不是正确的地方,请将我重定向到正确的地方问这个问题。