2012-12-12 11 views
7

Używam programu SQL Server 2008.Dane wyjściowe maski znaków na wybierz

Chciałbym maskować dane wyjściowe zapytania.

To moje dane z kolumny na stole, gdy robi select:

column1 

384844033434 

743423547878 

111224678885 

chciałbym wyjście takiego:

column1 

384xxxxxx434 

743xxxxxx878 

111xxxxxx885 

Jak mogę to zrobić?

+2

Looks tak jak mówisz o [maskowaniu znaków] (http: //www.simple-talk.com/sql/database-administration/obfuscating-your-sql-server-data /) zamiast szyfrowania –

+0

tak jest maskowanie znaków – pyram

Odpowiedz

7

Będziesz musiał użyć widoku i odmówić wszystkim użytkownikom SELECT dostępu do tabeli podstawowej.

Państwa zdanie będzie wyglądać

SELECT 
    SUBSTRING(x.SecurityNumber,1,3) + 
    'xxxxx' + 
    SUBSTRING(x.SecurityNumber,LEN(x.SecurityNumber) - 2, LEN(x.SecurityNumber)) 
    AS column1 
FROM underlyingTable x 

Następnie można udzielić użytkownikom dostępu do tylko SELECT tego widoku i mają out zamaskowany w sposób opisany.

Jeśli chcesz, aby oprogramowanie klienta mogło wstawiać lub aktualizować dane w tej tabeli, użyj aktualizacji INSTEAD OF INSERT lub INSTEAD OF UPDATE, aby zaktualizować tabelę podstawową.

+0

Dziękuję i dziękuję wszystkim za odpowiedzi! – pyram

+0

Używam sqlcmd dla SQL Server 2008 i stwierdziłem, że przesunięcia są różne. Dla poprawnego wyniku użyłem 'SUBSTRING (x.SecurityNumber, 1,3) + 'xxxxx' + SUBSTRING (x.SecurityNumber, LEN (x.SecurityNumber) - 2, LEN (x.SecurityNumber))' – David

+0

Dzięki @David. Edytowane odpowiednio. –

1

Prosta kwerenda wyboru zwróci tylko to, co jest na stole, bez względu na to, czy jest zaszyfrowane, czy nie.

Uważam, że nie można tego zrobić na poziomie bazy danych.

Aby spełnić twoje wymagania, potrzebujesz dwukierunkowego algorytmu szyfrowania do użycia w aplikacji, dzięki czemu możesz szyfrować dane przed zapisaniem ich zaszyfrowania w bazie danych, a także uzyskać zaszyfrowane informacje z bazy danych i odszyfrować je w aplikacji.

2

Jeśli wiesz, jak długo pole danych będzie, wówczas można użyć statycznej wersji, że druga odpowiedź będzie produkować, ale zawsze można utworzyć funkcję do wygenerowania tego:

CREATE FUNCTION MixUpCharacters 
(
    @OrigVal varchar(max) 
) 
RETURNS varchar(max) 
AS 
BEGIN 

DECLARE @NewVal varchar(max) 
DECLARE @OrigLen int 
DECLARE @LoopCt int 
DECLARE @Part varchar(max) = '' 
Declare @PartLength int 

SET @NewVal = '' 
SET @OrigLen = DATALENGTH(@OrigVal) 
SET @LoopCt = 1 

SET @Part = SUBSTRING(@OrigVal, 4, len(@OrigVal)-6) 
set @PartLength = LEN(@Part) 

WHILE @LoopCt <= @PartLength 
    BEGIN 
     -- Current length of possible characters 
     SET @NewVal = @NewVal + 'X' 

     -- Advance the loop 
     SET @LoopCt = @LoopCt + 1 
    END 

    Return REPLACE(@OrigVal, @Part, @NewVal) 
END 

dla tej funkcja przekaże ci wartości, które chcesz zamaskować.Więc zapytanie będzie:

declare @temp table 
(
    col1 varchar(50) 
) 

insert into @temp 
values ('384844033434'), ('743423547878'), ('111224678885') 

select dbo.MixUpCharacters(col1) col1 
from @temp 

Zobacz SQL Fiddle with Demo

Wynik byłby:

|   COL1 | 
---------------- 
| 384XXXXXX434 | 
| 743XXXXXX878 | 
| 111XXXXXX885 | 

Albo o to sposób to zrobić z rekurencyjnej CTE:

;with data(col1) as 
(
    select '384844033434' 
    union all 
    select '7434235878' 
    union all 
    select '111224678885' 
), 
s1 (col1, repfull) as 
(
    select col1, 
     SUBSTRING(col1, 4, len(col1)-6) repfull 
    from data 
), 
s2 (col1, item, repfull, r) as 
(
    select col1, 
     cast('x' as varchar(max)), 
     right(repfull, LEN(repfull)-1), 
     repfull 
    from s1 
    union all 
    select col1, 
     'x'+ cast(item as varchar(max)), 
     right(repfull, LEN(repfull)-1), 
     r 
    from s2 
    where len(repfull) >0 
) 
select REPLACE(col1, r, item) newValue 
from 
(
    select col1, item, R, 
     ROW_NUMBER() over(partition by col1 order by len(item) desc) rn 
    from s2 
) src 
where rn = 1 

Zobacz SQL Fiddle with Demo

1

bardzo prosty bro

SELECT CONCAT (SUBSTR('Your string',1,3),LPAD(SUBSTR('Your string',-3),LENGTH('Your string')-1,'*')) RESULT FROM dual 

wyjściowa:

Ty ******* ing

jeśli jest num typ konwersji do char

1

Jeśli chcesz do maskowania pola, którego nie znasz długości pola. Można uaktualnić kod bluefeet jest tak:

ALTER FUNCTION MixUpCharacters 
(
    @OrigVal varchar(MAX) 
) 
RETURNS varchar(MAX) 
AS 
BEGIN 

DECLARE @NewVal NVARCHAR(MAX) 
DECLARE @OrigLen INT 
DECLARE @LoopCt INT 
DECLARE @Part NVARCHAR(MAX) = '' 
DECLARE @PartLength INT  -- MastLength 
DECLARE @PartStartIndex INT -- MaskStartIndex 

SET @NewVal = '' 
SET @LoopCt = 1 
SET @OrigLen = LEN(@OrigVal) 

IF(@OrigLen = 1) 
    BEGIN 
     RETURN 'X' 
    END 
IF(@OrigLen < 6) 
    BEGIN 
     SET @PartStartIndex = @OrigLen/2 
     SET @PartLength = @OrigLen - @PartStartIndex 
     SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength) 
    END 
ELSE IF(@OrigLen < 8) 
    BEGIN 
     SET @PartStartIndex = 3 
     SET @PartLength = @OrigLen - @PartStartIndex - 1 
     SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength) 
    END 
ELSE 
    BEGIN 
     SET @PartStartIndex = 4 
     SET @PartLength = @OrigLen - @PartStartIndex - 2 
     SET @Part = SUBSTRING(@OrigVal, @PartStartIndex, @PartLength) 
    END 

WHILE @LoopCt <= @PartLength 
    BEGIN 
     -- Current length of possible characters 
     SET @NewVal = @NewVal + 'X' 

     -- Advance the loop 
     SET @LoopCt = @LoopCt + 1 
    END 

    RETURN REPLACE(@OrigVal, @Part, @NewVal) 
END 

można testować tak:

SELECT dbo.MixUpCharacters('1') 
UNION ALL 
SELECT dbo.MixUpCharacters('12') 
UNION ALL 
SELECT dbo.MixUpCharacters('123') 
UNION ALL 
SELECT dbo.MixUpCharacters('1234') 
UNION ALL 
SELECT dbo.MixUpCharacters('12345') 
UNION ALL 
SELECT dbo.MixUpCharacters('123456') 
UNION ALL 
SELECT dbo.MixUpCharacters('1234567') 
UNION ALL 
SELECT dbo.MixUpCharacters('12345678') 
UNION ALL 
SELECT dbo.MixUpCharacters('123456789') 
UNION ALL 
select dbo.MixUpCharacters('1234567890') 
UNION ALL 
select dbo.MixUpCharacters('12345678910') 

WYNIKI:

X 
X2 
XX3 
1XX4 
1XXX5 
12XX56 
12XXX67 
123XX678 
123XXX789 
123XXXX890 
123XXXXX910 
0

Od SQL Server 2016+ można użyć Dynamic Data Masking funkcję.

Dynamiczne maskowanie danych ogranicza wrażliwą ekspozycję danych poprzez maskowanie jej do nieuprzywilejowanych użytkowników. Dynamiczne maskowanie danych pomaga zapobiegać nieautoryzowanemu dostępowi do poufnych danych, umożliwiając klientom określenie zakresu danych wrażliwych, które ujawnią się przy minimalnym wpływie na warstwę aplikacji. Jest to funkcja ochrony danych, która ukrywa poufne dane w zestawie wyników zapytania w wyznaczonych polach bazy danych, podczas gdy dane w bazie danych nie są zmieniane. Dynamiczne maskowanie danych jest łatwe w użyciu w istniejących aplikacjach, ponieważ reguły maskowania są stosowane w wynikach zapytania. Wiele aplikacji może zamaskować poufne dane bez modyfikowania istniejących zapytań.

CREATE TABLE #tab(ID INT IDENTITY(1,1), column1 VARCHAR(12)); 

INSERT INTO #tab(column1) 
VALUES('384844033434'),('743423547878'),('111224678885'); 

SELECT * FROM #tab; 

wyjścia:

╔════╦══════════════╗ 
║ ID ║ column1 ║ 
╠════╬══════════════╣ 
║ 1 ║ 384844033434 ║ 
║ 2 ║ 743423547878 ║ 
║ 3 ║ 111224678885 ║ 
╚════╩══════════════╝ 

ALTER TABLE #tab 
ALTER COLUMN column1 VARCHAR(12) MASKED WITH (FUNCTION = 'partial(3,"xxxxxx",3)'); 

SELECT * FROM #tab; 

wyjścia:

╔════╦══════════════╗ 
║ ID ║ column1 ║ 
╠════╬══════════════╣ 
║ 1 ║ 384xxxxxx434 ║ 
║ 2 ║ 743xxxxxx878 ║ 
║ 3 ║ 111xxxxxx885 ║ 
╚════╩══════════════╝ 

LiveDemo

Powiązane problemy