【问题标题】:Querying and ordering results of a database in grails using transient fields使用瞬态字段在grails中查询和排序数据库的结果
【发布时间】:2011-01-26 21:29:39
【问题描述】:

我正在尝试从 grails 域对象中显示分页数据。例如: 我有一个域对象 Employee ,其属性 firstName 和 lastName 是瞬态的,当调用它们的 setter/getter 方法时,它们会加密/解密数据。数据以加密的二进制格式保存在数据库中,因此无法按这些字段排序。再一次,也不能按瞬态排序,如下所示: http://www.grails.org/GSP+Tag+-+sortableColumn.

所以现在我正在尝试以类似于以下方式使用瞬变的方法:

Employee.withCriteria( max: 10, offset: 30 ){
    order 'lastName', 'asc'
    order 'firstName', 'asc'
} 

班级是:

class Employee {

byte[] encryptedFirstName
byte[] encryptedLastName

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


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

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

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

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

}

【问题讨论】:

    标签: hibernate grails grails-orm encryption


    【解决方案1】:

    由于执行 GORM/hibernate 标准的方式,这无法正常工作。这些订单指令被翻译成 SQL,并且只能在非瞬态字段上操作,因为它发生在数据库层。

    您的选择是:

    1. 将查询结果加载到内存中,并使用未加密的值自行进行排序和分页。
    2. 使用数据库的加密功能和自定义查询(例如“select * from employee order by AES_DECRYPT(lastName, key)”)。请注意,这会给您的数据库带来大量额外负载。
    3. 以可用于排序的未加密形式存储某些内容。示例:lastName 的前几个字母。但是,这会泄露您试图确保安全的一些信息。

    【讨论】:

    • 感谢您的选择列表,它们符合我的预期。我当然想避免第一个,因为它会占用大量应用程序内存。第二个应该可以工作,如果我的数据库(MySQL 5.0)确实支持 AES_DECRYPT 并且至于最后一个,我真的很想看看是否有一个很好的散列算法可以保留排序但不会泄漏信息。
    猜你喜欢
    • 1970-01-01
    • 2022-01-09
    • 2015-09-07
    • 2014-01-08
    • 2012-10-30
    • 2013-04-26
    • 1970-01-01
    • 2021-08-05
    相关资源
    最近更新 更多