এনক্রিপ্ট করা / এনক্রিপ্ট করা ডেটা রয়েছে এমন এসকিউএল সার্ভার ২০০৮ আর 2 এর সমস্ত কলামগুলি খুঁজে পাওয়ার জন্য কি দ্রুত উপায় আছে?


10

এনক্রিপ্ট করা / এনক্রিপ্ট করা ডেটা রয়েছে এমন এসকিউএল সার্ভার ২০০৮ আর 2 এর সমস্ত কলামগুলি খুঁজে পাওয়ার জন্য কি দ্রুত উপায় আছে?

বিকাশ সার্ভারে সমস্ত এনক্রিপ্ট হওয়া কলামগুলিতে আমার ডেটা বাতিল করতে হবে (আমাদের ব্যবসায়ের নিয়ম অনুসারে)। আমি বেশিরভাগ কলামগুলি জানি কারণ আমরা সেগুলি নিয়মিত ব্যবহার করি তবে আমি পুরোপুরি সুস্থ হতে চাই এবং আমি প্রমাণ করতে সক্ষম হতে চাই যে আমি সেগুলি পেয়েছি।

আমি ওয়েব, লাগছিল অনুসন্ধান করেছেন INFORMATION_SCHEMA এবং টিক চিহ্ন DMVs আমি ভেবেছিলাম দরকারী এবং হবে sys.columns এবং sys.objects কোন ভাগ্য কিন্তু এতদূর -।


1
আমরা এখানে অলস এবং গণিত কলাম রয়েছে যা অটোডক্রিপটিভুডু ব্যবহার করে। যদি
আপনিও তেমন

উত্তর:


10

ধরে নিই যে আপনি এসকিউএল সার্ভার কীগুলির সাহায্যে এনক্রিপ্ট করা ডেটার বিষয়ে কথা বলছেন, এই কলামগুলি খুঁজে পাওয়ার উপায় আছে।

এই Key_name()নির্দিষ্ট মানটির জন্য এনক্রিপশনের জন্য ব্যবহৃত কীটির নামটি ফাংশনটি ফিরিয়ে দেবে এবং "জ্ঞাত" কী (তৃতীয় পক্ষ, বা এনক্রিপ্ট করা সহজ নয়) এর সাথে এনক্রিপ্ট করা কিছু না থাকলে NULL ফিরিয়ে দেবে।

সেই জ্ঞানগ্রেডের সাহায্যে আমরা প্রতিটি কলামটিতে এটি পরীক্ষা করতে পারি যে এটিতে কমপক্ষে একটি সারি রয়েছে যা একটি ভের্বাইনারি মান রয়েছে যা একটি মূল নাম দেয়

কী_নামের কার্যকারিতা ()

--create a test database
CREATE DATABASE [Test_ENCR]
GO

--change context
USE [Test_ENCR]
GO


--because it's possible to encrypt different rows with different keys I'll create 2 keys for this demo
-- Create a symmetric key
CREATE SYMMETRIC KEY symmetricKey1
   WITH ALGORITHM = AES_128
   ENCRYPTION BY PASSWORD = 'password01!';
GO

-- Create a second key
CREATE SYMMETRIC KEY symmetricKey2 
   WITH ALGORITHM = AES_128
   ENCRYPTION BY PASSWORD = 'password02!';
GO



--create a table that will have a column holding:
--1: encrypted row with key1
--2: encrypted row with key2
--3: a non encrypted just varbinary value

CREATE TABLE encryptedTable
(ID int IDENTITY PRIMARY KEY,
EncryptedCol varbinary(256) NOT NULL);
GO


-- open key1
OPEN SYMMETRIC KEY symmetricKey1 
    DECRYPTION BY PASSWORD = 'password01!';
GO

-- open key2
OPEN SYMMETRIC KEY symmetricKey2 
    DECRYPTION BY PASSWORD = 'password02!';
GO

--insert encrypted data with key1
INSERT INTO encryptedTable(encryptedCol)
VALUES ( ENCRYPTBYKEY (Key_GUID('symmetricKey1'), 'EncryptedText1'));
GO

--insert encrypted data with key2
INSERT INTO encryptedTable(encryptedCol)
VALUES ( ENCRYPTBYKEY (Key_GUID('symmetricKey2'), 'EncryptedText2'));
GO


--insert just varbinary data
INSERT INTO encryptedTable(encryptedCol)
VALUES (CONVERT(varbinary(256),'NotEncryptedTextJustVarBinary'))



--have a look, without the key, all varbinary for you.
SELECT * FROM encryptedTable
GO

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

--Return all key_names
SELECT DISTINCT     key_name(encryptedcol), 
                    EncryptedCol 
FROM encryptedTable;

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

এনক্রিপ্ট করা কলামগুলি কীভাবে এটি প্রয়োগ করতে হয়

--How do we dynamically find all the columns that have at least one row with a encrypted value?

-- first we will find all tables and column with a varbinary datatype
-- then we will test all those columns with a simple select
-- If the key_name() function returns a value, the column and table name are stored together with the keyname

--create a table to hold all varbinary columns and tables
CREATE TABLE #TablesWithVarbinCols (    ID int IDENTITY,
                                TableName nvarchar(128),
                                ColumnName nvarchar(128)
                                );

--create a table to hold the end result
CREATE TABLE #TablesWithEncryption (
                                TableName nvarchar(128),
                                ColumnName nvarchar(128),
                                KeyName varchar(128)
                                );


--find and store all table and column names of user tables containing a varbinary column
INSERT INTO #TablesWithVarbinCols (TableName,ColumnName)
SELECT      o.[name] as TableName,
            c.[name] as ColumnName
FROM        sys.objects o
INNER JOIN  sys.columns c
ON          o.[object_id]=c.[object_id] 
INNER JOIN  sys.types t
ON          c.system_type_id=t.system_type_id
WHERE       o.[type]='U'
AND         t.name=N'varbinary'
AND         c.max_length > -1;


DECLARE @col nvarchar(256)
DECLARE @tab nvarchar(256)
DECLARE @c int = 1
DECLARE @MaxC int
DECLARE @SQL varchar(max)

SELECT @MaxC=MAX(ID)
FROM #TablesWithVarbinCols

--loop the previous result and create a simple select statement with a key_name() is not null where clause. 
--If you have a result, store the details
WHILE @c <= @MaxC
BEGIN
    SELECT  @Tab=TableName,
         @col=ColumnName
    FROM    #TablesWithVarbinCols
    WHERE   ID=@c

    SET @SQL='  INSERT INTO #TablesWithEncryption (TableName, ColumnName, KeyName)
                SELECT DISTINCT '''+@Tab +''',''' +@col +''', key_name('+@Col +') from '+ @tab +' 
                WHERE key_name('+@Col +') is not null;'
    exec (@SQL)

    DELETE
    FROM #TablesWithVarbinCols
    WHERE id=@c;
    SET @c=@c+1
END

--select the result
SELECT * FROM #TablesWithEncryption;

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

--cleanup
DROP TABLE #TablesWithVarbinCols;
DROP TABLE #TablesWithEncryption;

8

সেল স্তর এনক্রিপশনের সমস্যাটি হ'ল কলামটি নিজেই সত্যই এনক্রিপ্ট করা হয়নি, এটি column কলামটিতে থাকা ডেটা। কলামগুলি এগুলি কেবলমাত্র ভেরিবিনারি কলাম (কারণ এটি প্রয়োজনীয়) এবং এতে সম্পূর্ণ সুস্পষ্ট ডেটা থাকতে পারে। এটি হ'ল ডেটা এনক্রিপ্ট করা ENCRYPTBY*এবং DECRYPTBY*ফাংশনগুলির ব্যবহার ।

আপনি কেবল বর্ণের সমস্ত কলামগুলির জন্য সিসি কলামগুলি দেখার জন্য অনুসন্ধান শুরু করতে পারেন:

select
  object_name(a.object_id) [objectname]
  ,a.name [columnname]
  ,a.column_id
from
   sys.columns a
   join sys.types b on (a.system_type_id = b.system_type_id)
where
   b.name = N'varbinary';

অন্যথায়, এনক্রিপশন / ডিক্রিপশন ফাংশনগুলি কোথায় ব্যবহৃত হচ্ছে তা সনাক্ত করতে আপনাকে আপনার কোডটি পর্যালোচনা করতে হবে:

select
   object_name(object_id) [objectname]
   ,definition
from
   sys.sql_modules
where
   definition like N'%ENCRYPT%' 
   OR definition like N'%DECRYPT%';

1

একটি নির্দিষ্ট ডিবিতে নীচের কোয়েরিটি চালান

select 
    t.name as [Table],
    c.name as [Column], 
    c.encryption_type_desc
from   
    sys.all_columns c inner join
    sys.tables t on c.object_id = t.object_id
where  
    c.encryption_type is not null 
order by
    t.name,
    c.name

থেকে সামান্য পরিবর্তন

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/ca9d8360-5d7e-4de1-abe6-ce1afda595a9/how-to-find-which-table-columns-are-encrypted?forum=sqlsecurity


1

আপনি সমস্ত বর্ণের কলামগুলি অনুসন্ধান করে এবং KEY_NAME ফাংশন সহ একটি এনক্রিপশন কীটি পরীক্ষা করে কীগুলি \ শংসাপত্রগুলির সাথে এনক্রিপ্ট করা কলামগুলি সন্ধান করতে পারেন।

তবে এই প্রক্রিয়াটি কিছুটা ব্যয়বহুল এবং সময়সাপেক্ষ। আপনার যদি নিয়মিত এই কলামগুলি সন্ধানের প্রয়োজন হয় তবে আমি প্রসারিত বৈশিষ্ট্যযুক্ত কলামগুলিকে "ট্যাগিং" করার পরামর্শ দিচ্ছি। আমরা এডওয়ার্ড ডর্টল্যান্ডের সমাধান এবং এনক্রিপ্ট, এনক্রিপ্টকি এবং এনক্রিপ্টসার্টের মতো বর্ধিত বৈশিষ্ট্য সহ কলামগুলি "ট্যাগ" তৈরি করতে পারি।

--create a table to hold all varbinary columns and tables
CREATE TABLE #TablesWithVarbinCols (    ID int IDENTITY,
                            SchemaName nvarchar(128),
                            TableName nvarchar(128),
                            ColumnName nvarchar(128)
                            );

--find and store all table and column names of user tables containing a 
varbinary column
INSERT INTO #TablesWithVarbinCols (SchemaName,TableName,ColumnName)
SELECT      s.[name] as SchemaName,
            o.[name] as TableName,
            c.[name] as ColumnName
FROM        sys.objects o
INNER JOIN  sys.schemas s
ON          s.[schema_id] = o.[schema_id]
INNER JOIN  sys.columns c
ON          o.[object_id]=c.[object_id] 
INNER JOIN  sys.types t
ON          c.system_type_id=t.system_type_id
WHERE       o.[type]='U'
AND         t.name=N'varbinary'
AND         c.max_length > -1;

DECLARE @sch nvarchar(128)
DECLARE @col nvarchar(256)
DECLARE @tab nvarchar(256)
DECLARE @key nvarchar(256)
DECLARE @cert nvarchar(256)
DECLARE @c int = 1
DECLARE @MaxC int
DECLARE @SQL nvarchar(max)

SELECT @MaxC=MAX(ID)
FROM #TablesWithVarbinCols

--loop the previous result and create a simple select statement with a 
key_name() is not null where clause. 
--If you have a result, store the details
WHILE @c <= @MaxC
BEGIN
    SET @key = NULL;
    SELECT  @sch=SchemaName,
            @Tab=TableName,
            @col=ColumnName
    FROM    #TablesWithVarbinCols
    WHERE   ID=@c


SET @SQL='SELECT DISTINCT @key= key_name('+@Col +') from '+ @tab +' 
            WHERE key_name('+@Col +') is not null;'


exec sp_executesql @SQL, N'@key nvarchar(256) out', @key out

SELECT @cert =  c.name 
from sys.symmetric_keys sk
join sys.key_encryptions ke
    on
    sk.symmetric_key_id= ke.key_id
join sys.certificates c
    on
    ke.thumbprint=c.thumbprint
where sk.name = @key


IF (@key IS NOT NULL)
BEGIN

    SET @SQL=
    'EXEC sp_addextendedproperty @name = N''encrypted'', @value = N''1'', '+
    '@level0type = N''Schema'', @level0name = '''+@Sch+''', '+
    '@level1type = N''Table'', @level1name = '''+@tab+''','+
    '@level2type = N''Column'', @level2name = '''+@col+'''
    '

    EXEC sp_executesql @SQL

    SET @SQL=
    'EXEC sp_addextendedproperty @name = N''encryptkey'', @value = '''+@key+''', '+
    '@level0type = N''Schema'', @level0name = '''+@Sch+''', '+
    '@level1type = N''Table'', @level1name = '''+@tab+''','+
    '@level2type = N''Column'', @level2name = '''+@col+'''
    '

    EXEC sp_executesql @SQL

    SET @SQL=
    'EXEC sp_addextendedproperty @name = N''encryptcert'', @value = '''+@cert+''', '+
    '@level0type = N''Schema'', @level0name = '''+@Sch+''', '+
    '@level1type = N''Table'', @level1name = '''+@tab+''','+
    '@level2type = N''Column'', @level2name = '''+@col+'''
    '

    EXEC sp_executesql @SQL

END

DELETE
FROM #TablesWithVarbinCols
WHERE id=@c;
SET @c=@c+1

END

drop table #TablesWithVarbinCols

তারপরে আমরা প্রসারিত বৈশিষ্ট্যগুলি অনুসন্ধান করে সহজেই এনক্রিপ্ট হওয়া কলামগুলি খুঁজে পেতে পারি।

--Adjust WHERE clause depending on what tags you are looking for
SELECT
   SCHEMA_NAME(tbl.schema_id) AS SchemaName,    
   tbl.name AS TableName, 
   clmns.name AS ColumnName,
  p.name AS ExtendedPropertyName,    --remove for programming
   CAST(p.value AS sql_variant) AS ExtendedPropertyValue
FROM
   sys.tables AS tbl
   INNER JOIN sys.all_columns AS clmns ON clmns.object_id=tbl.object_id
   INNER JOIN sys.extended_properties AS p ON p.major_id=tbl.object_id AND p.minor_id=clmns.column_id AND p.class=1
WHERE p.name in ('encrypted','encryptkey','encryptcert')
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.