我正在使用dbix :: class和catalyst来与我的数据库进行交互。但是,我存储的一些数据是敏感的,所以我想在它进入数据库(插入或更新)之前加密,并在它出来(选中)时解密。我知道如何使用这个模块:DBIx::Class::PassphraseColumn
通过在模式文件中将此密码放入数据库中,您可以自动加密密码:
__PACKAGE__->add_columns(
'+password' => {
passphrase => 'rfc2307',
passphrase_class => 'BlowfishCrypt',
passphrase_args => {
cost => 14,
salt_random => 20,
},
passphrase_check_method => 'check_password',
}
);
因此,无论何时更新密码,您都不必担心加密密码,DBIx只会为您完成。是否有类似的方式,每当我插入或更新一个值的列,它会为我加密它,每当我选择它时,它将被解密为我?或者有没有办法添加一个在插入或更新之前调用的方法,或者在一个让您有机会操作数据的选择之后?谢谢!
答案 0 :(得分:1)
看看column accessor overloading。如果数据不为空,您可以加密@_中的数据,并在返回值时解密。我修改了该页面上的示例以更好地满足您的需求:
__PACKAGE__->add_columns(description => { accessor => '_description' });
sub description {
my $self = shift;
# If there is an update to the column, encrypt it before calling the original accessor
return $self->_description(encrypt($_[0])) if @_;
# Fetch and decrypt the column value.
return decrypt($self->_description);
}
你仍然需要指定encrypt()和decrypt(),但这会让你大部分都在那里。