SQL Server присоединяется к столбцам, которые были зашифрованы парольной фразой - PullRequest
0 голосов
/ 01 марта 2019

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

Здесь приведены сведения о том, что находится ниже, если вы хотите попробовать https://dbfiddle.uk/?rdbms=sqlserver_2017&fiddle=cc71b4969526eb0fedd22de2828abaa3

setup

create table encrypt.empsone(empno varchar(10),empno_encrypted varbinary(100));
create table encrypt.empstwo(empno varchar(10),empno_encrypted varbinary(100));

insert into encrypt.empsone(empno, empno_encrypted )
       values('001', EncryptByPassPhrase('my passphrase','001'))

insert into encrypt.empstwo(empno, empno_encrypted )
       values('001', EncryptByPassPhrase('my passphrase','001'))

все выглядит хорошо

select a.empno,
      CONVERT(varchar,(DECRYPTBYPASSPHRASE('my passphrase', a.empno_encrypted))) from encrypt.empsone a

empno      no name
  001        001

но объединение не работает

select * from encrypt.empsone a join encrypt.empstwo b
on a.empno_encrypted = b.empno_encrypted

Я предполагаю, что зашифрованные значения не идентичны, есть ли вариантв зашифрованном паролем для достижения этой цели?Я надеюсь, мне не нужно переписывать все объединения, чтобы использовать функцию decryptbypassphrase

1 Ответ

0 голосов
/ 02 марта 2019

О, дорогой, я только что понял, что вы используете EncryptByPassPhrase.Каждый раз, когда он запускается, он генерирует новый симметричный ключ.Таким образом, выходной шифр будет отличаться при каждом запуске этого.

Взгляните.

select EncryptByPassPhrase('my passphrase','001')
    ,  EncryptByPassPhrase('my passphrase','001')

Чтобы выполнить то, что вы пытаетесь сделать, вам необходимо расшифровать значение, которое даст вам двоичный код значения, с которого вы начали.

select * 
    , decryptbypassphrase('my passphrase', a.empno_encrypted)
    , decryptbypassphrase('my passphrase', b.empno_encrypted)
from empsone a 
join empstwo b on decryptbypassphrase('my passphrase', a.empno_encrypted) = decryptbypassphrase('my passphrase', b.empno_encrypted)

И если вам нужно вернуть исходное значение, вы просто приводите результат decryptbypassphrase к исходному типу данных.

select * 
    , convert(varchar(10), decryptbypassphrase('my passphrase', a.empno_encrypted))
    , convert(varchar(10), decryptbypassphrase('my passphrase', b.empno_encrypted))
from empsone a 
join empstwo b on decryptbypassphrase('my passphrase', a.empno_encrypted) = decryptbypassphrase('my passphrase', b.empno_encrypted)
...