AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 264926
Accepted
John G Hohengarten
John G Hohengarten
Asked: 2020-04-14 14:56:29 +0800 CST2020-04-14 14:56:29 +0800 CST 2020-04-14 14:56:29 +0800 CST

Sempre criptografado: como faço para uma união de igualdade com uma coluna não criptografada em uma coluna criptografada determinística?

  • 772

A documentação oficial da Microsoft para Always Encrypted no SQL Server 2017 afirma:

A criptografia determinística sempre gera o mesmo valor criptografado para qualquer valor de texto simples.

O uso de criptografia determinística permite pesquisas de ponto, junções de igualdade , agrupamento e indexação em colunas criptografadas.

(grifo meu)

Atualmente, estou usando o SQL Server 2017 RTM-CU17 (KB4515579) v14.0.3238.1 Standard Edition.

Minha conexão SSMS (atualmente usando v18.4) já está configurada com a Enable Always Encrypted (column encryption)caixa de seleção marcada, e as opções de consulta -> Execução -> configuração avançada Enable Parameterization for Always Encryptedtambém estão marcadas.

Abaixo está o esquema da tabela que tenho.

As colunas EmployeeIDe são criptografadas com .FullNameDeterministic Encryption Type

A Tempcoluna é criptografada com Randomized Encryption Type.

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[EmployeeTemperature]
(
    [Entry] [int] IDENTITY(1,1) NOT NULL,
    [CheckerID] [varchar](26) NOT NULL,
    [EmployeeID] [char](10) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
    [FullName] [varchar](50) COLLATE Latin1_General_BIN2 ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
    [Temp] [decimal](4, 1) ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Randomized, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
    [Date] [date] NOT NULL, -- to support Date-CheckerID-FullName unique constraint
    [DateTime] [datetime] NOT NULL,
    [Station] [smallint] NOT NULL,
    [Question1] [bit] NOT NULL,
    [Question2] [bit] NOT NULL
) ON [PRIMARY]
GO

SET ANSI_PADDING ON
GO

CREATE UNIQUE CLUSTERED INDEX [UCI_EmployeeTemperature]
ON [dbo].[EmployeeTemperature]
(
    [Date] ASC,
    [CheckerID] ASC,
    [FullName] ASC
)
WITH
(
PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]

GO

O Stored Procedurecódigo abaixo é usado para recuperar os dados criptografados (eventualmente será usado por um aplicativo Web ASPX Single Page Application (SPA)).

--SELECT OBJECT_ID('dbo.sp_GetEmployeeTemps','P') -- debug below
IF OBJECT_ID('dbo.sp_GetEmployeeTemps','P') IS NULL
   EXEC('CREATE PROCEDURE [dbo].[sp_GetEmployeeTemps] AS BEGIN SET NOCOUNT ON; END')
GO

ALTER PROCEDURE [dbo].[sp_GetEmployeeTemps]
AS

SELECT
 ET.[Entry]
,CASE
    WHEN HR.[Employee_ID] IS NOT NULL THEN 'E'
  ELSE 'V'
 END AS [Visitor] -- Show if record is for Employee or Visitor
,ISNULL(HR.[Name],ET.[FullName]) AS [Name] -- ISNULL for visitor. return visitor's name if not an employee.
,ET.[Temp]
,(SELECT DISTINCT chk.[Name] FROM [dbo].[Checker] AS chk INNER JOIN [dbo].[EmployeeTemperature] ON ET.[CheckerID] = chk.[LoginID]) AS [Checker]
,CAST(FORMAT(ET.[DateTime], 'yyyy-MM-dd hh:mm:ss', 'en-US') AS DATETIME) AS [Time] -- so that it doesn't round seconds to minutes (converting to SMALLDATETIME does that) and shows to the second.
,CASE
    WHEN ET.[Question1] = 1 THEN 'Yes'
    WHEN ET.[Question1] = 0 THEN 'No' 
 ELSE NULL
 END AS [Question1]
,CASE
    WHEN ET.[Question2] = 1 THEN 'Yes'
    WHEN ET.[Question2] = 0 THEN 'No' 
 ELSE NULL
 END AS [Question2]
FROM [dbo].[vw_Employees] AS HR
FULL JOIN -- to allow Visitors to be retrieved
(
    SELECT
     [Entry]
    ,[Temp]
    ,[CheckerID]
    ,[FullName]
    ,[EmployeeID]
    ,[DateTime]
    ,[Question1]
    ,[Question2]
    FROM [dbo].[EmployeeTemperature]
    WHERE CONVERT(DATE, [DateTime]) = CONVERT(DATE, GETDATE())
) AS ET
ON HR.[Employee_ID] = ET.[EmployeeID] -- encrypted
WHERE ET.[Entry] IS NOT NULL -- to not show unchecked employees.

GO

EXEC sp_refresh_parameter_encryption 'dbo.sp_GetEmployeeTemps';

Quando tento criar ou alterar o procedimento acima, recebo o erro abaixo:

The data types char and char(10) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'Employee_Temperature') collation_name = 'Latin1_General_BIN2' are incompatible in the equal to operator.

Isso parece indicar que o problema é com esta cláusula JOIN:

ON HR.[Employee_ID] = ET.[EmployeeID] -- encrypted

Nessa junção, o HR.[Employee_ID]não é criptografado e faz parte da [vw_Employees]exibição, e o ET.[EmployeeID]é a coluna criptografada.

Por que essa união de igualdade não funciona? A documentação afirma que as colunas criptografadas podem ser usadas em junções de igualdade, o que claramente é.

Esse é o problema nº 1.


O problema nº 2 parece estar ISNULLenvolvendo a coluna criptografada ET.[FullName].

Se eu comentar essa junção e fizer ON 1 = 1para fins de depuração, recebo um erro adicional:

Operand type clash: varchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'Employee_Temperature') collation_name = 'Latin1_General_BIN2' is incompatible with varchar

Alguma sugestão para lidar com esse cenário?

Solicitei que o MS Docs fosse atualizado com exemplos no GitHub: https://github.com/MicrosoftDocs/sql-docs/issues/4550

encryption sql-server-2017
  • 1 1 respostas
  • 1535 Views

1 respostas

  • Voted
  1. Best Answer
    LowlyDBA - John M
    2020-04-15T09:12:15+08:002020-04-15T09:12:15+08:00

    Nesta junção, o HR.[Employee_ID] não é criptografado e faz parte da visualização [vw_Employees], e o ET.[EmployeeID] é a coluna criptografada.

    Por que essa união de igualdade não funciona? A documentação afirma que as colunas criptografadas podem ser usadas em junções de igualdade, o que claramente é.

    Dê uma olhada mais de perto na documentação:

    A criptografia determinística sempre gera o mesmo valor criptografado para qualquer valor de texto simples.

    O uso de criptografia determinística permite pesquisas de ponto, junções de igualdade, agrupamento e indexação em colunas criptografadas .

    (ênfase minha) e lembre-se do caso de uso básico do Always Encrypted:

    O Always Encrypted permite que os clientes criptografem dados confidenciais dentro de aplicativos cliente e nunca revelem as chaves de criptografia para o Mecanismo de Banco de Dados...

    Se o mecanismo nunca estiver ciente do valor não criptografado, como ele poderá comparar um valor não criptografado versus criptografado em uma junção?

    Você pode fazer pesquisas, junções, etc. em criptografia determinística, pois obterá o mesmo valor criptografado para uma entrada estática. Em nenhum lugar menciona que você pode comparar criptografado com não criptografado, no entanto.

    No seu caso, você precisaria criptografar sua chave de pesquisa para encontrar uma correspondência na coluna criptografada, o que é determinístico, portanto, se eles forem o mesmo valor inicial, você poderá corresponder aos valores criptografados.

    TL;DR - A união de colunas criptografadas determinísticas a colunas criptografadas determinísticas é OK, a união de não criptografado a criptografado não é.

    • 2

relate perguntas

  • Quando preciso fazer backup da Chave Mestra de Serviço?

  • Implementando uma tabela criptografada no SQL Azure

  • Criptografia do Microsoft SQL Server 2008 em várias versões de banco de dados

  • Criptografia Cassandra em repouso

  • MySQL: Como o AES_ENCRYPT transforma a senha em uma chave?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve