2012-06-22 5 views
0

데이터베이스와 상호 작용하기 위해 촉매제와 함께 dbix :: class를 사용하고 있습니다. 그러나, 내가 저장하고있는 데이터 중 일부는 민감하기 때문에 데이터베이스에 들어가기 전에 (삽입 또는 업데이트) 암호화가되어 나오고 (선택됨) 해독 할 때 암호화하고 싶습니다.dbix :: class 업데이트 또는 삽입 전에 열 데이터 수정

__PACKAGE__->add_columns(
    '+password' => { 
     passphrase  => 'rfc2307', 
     passphrase_class => 'BlowfishCrypt', 
     passphrase_args => { 
      cost  => 14, 
      salt_random => 20, 
     }, 
     passphrase_check_method => 'check_password', 
    } 
); 

는 그래서 언제 당신은 당신이없는 암호를 업데이트 : DBIx::Class::PassphraseColumn 자동 스키마 파일이 필요하여 데이터베이스에 퍼팅 할 때 암호를 암호화 할 수 있습니다 : 그리고이 모듈을 사용하여 방법을 알고 그것을 암호화하는 것에 대해 걱정할 필요가 있습니다. DBIx는 당신을 위해서 그것을합니다. 비슷한 방법으로 열을 삽입하거나 값을 업데이트 할 때마다 나를 암호화하고 선택한 경우 언제든지 해독 할 수 있습니까? 또는 삽입 또는 업데이트 전에 또는 데이터를 조작 할 수있는 선택 영역 뒤에 호출되는 메서드를 추가하는 방법이 있습니까? 감사!

+0

'DBIx :: Class'에 익숙하지 않지만 한 열에서이 작업을 수행 할 수 있다면 모든 필드가 포함 된 루프를 작성하고 각각에 대해이 필드를 추가 할 수 없습니까? 각 테이블에 대해 'SHOW FIELDS' 문으로 열을 먼저 얻을 수도 있습니다. 약간 지루하고 핸들러를 INSERT, UPDATE 및 SELECT에 추가하는 방법이 있지만 처음이라 생각합니다. – simbabque

+0

보통 이러한 메소드를 여러분의'ResultSet' 클래스에 추가 할 것입니다. –

답변

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); 
} 

, 그러나 이것은 당신에게이 방법의 대부분을 가져옵니다 더 나은 사용자의 요구에 맞게 해당 페이지에 예제를 수정했습니다.