2015-01-17 3 views
2

Я использую PostgreSQL 8.4 и используя функцию pgp_sym_encrypt в расширении pgcrypto для шифрования данных при вставке. так что моя вставка запрос будет выглядеть следующим образом:postgresql ограничение первичного ключа на зашифрованные данные с использованием расширения pgcrypto

insert into myTable (
        column1 
        ,column2 
        ) 
values (
     pgp_sym_encrypt('value1','key') 
     ,pgp_sym_encrypt('value1','key') 
     ); 

Я применил ограничение первичного ключа на column1 в таблице, но ограничение не будет обнаруживать вставив уже существующее значение, потому что зашифрованные данные не всегда будут одинаковыми для же дешифрованные значения.

Вопрос:

Как я могу применить это ограничение, так что проверяет, если расшифрованные данные матчи и не позволяют вставлять в таком случае?

ответ

2

Если вы хотите обеспечить уникальность, лучшим вариантом будет хэш вашей информации и сохранение этого хеша в отдельном столбце с уникальным индексом, я часто использую дайджесты, чтобы проверять уникальность более длинного текста исключительно из-за небольших требований к пространству однако, из-за необратимого характера хэшей остаток должен быть неоткрытым. Сначала нужен столбец:

alter table myTable add column column3 bytea unique; 

Тогда для вставки просто включить 3-й столбец

insert into myTable(
column1 
,column2 
,column3 
) 
values (
pgp_sym_encrypt('value1','key') 
,pgp_sym_encrypt('value1','key') 
,digest('value1', 'sha256') 
) 

sha256 должен легко искажать данные достаточно, что все хранится в таком виде никогда не будет успешно расшифрованы и в двоичный столбец будет содержать только 32 байта плюс индекс. Для записи длины данных для различных хешей являются:

select length(digest('your message goes here', 'sha1')); 
-- 20 
select length(digest('your message goes here', 'sha256')); 
-- 32 
select length(digest('your message goes here', 'sha512')); 
-- 64 

Наконец, вы шифровать «value1» дважды «ключ», или они из двух отдельных частей информации? Я собираюсь угадать, что они должны быть двумя разными столбцами данных, если это так, и вам нужна уникальность, и вам, конечно же, потребуется создать еще один столбец и хэш.

+0

спасибо большое человеку ... точно, что я ищу. – user3352940

 Смежные вопросы

  • Нет связанных вопросов^_^