2012-12-12 8 views
7

Utilizzo SQL Server 2008.Maschera carattere dati di output su select

Vorrei mascherare i dati di output di una query.

questo è il mio dati da una colonna su un tavolo quando si fa un prescelto:

column1 

384844033434 

743423547878 

111224678885 

Vorrei un output simile a questo:

column1 

384xxxxxx434 

743xxxxxx878 

111xxxxxx885 

Come posso fare questo?

+2

Looks come stai parlando di [mascheramento del personaggio] (http: //www.simple-talk.com/sql/database-administration/obfuscating-your-sql-server-data /) piuttosto che crittografia –

+0

sì è mascheramento di caratteri – pyram

risposta

7

Dovresti utilizzare una vista e negare a tutti gli utenti l'accesso SELECT alla tabella sottostante.

tuo punto di vista sarebbe simile

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

Si potrebbe quindi concedere agli utenti l'accesso SELECT per solo questo punto di vista e hanno il fuori mascherato nel modo descritto.

Se si desidera che il software client sia in grado di inserire o aggiornare i dati in questa tabella, si utilizzerà un trigger INSTEAD OF INSERT o INSTEAD OF UPDATE per aggiornare la tabella di base.

+0

Grazie e grazie a tutti per le risposte! – pyram

+0

Sto usando sqlcmd per SQL Server 2008 e ho scoperto che gli offset sono diversi. Per l'output corretto, ho usato 'SUBSTRING (x.SecurityNumber, 1,3) + 'xxxxx' + SUBSTRING (x.SecurityNumber, LEN (x.SecurityNumber) - 2, LEN (xSecurityNumber))' – David

+0

Grazie a @David. Modificato di conseguenza. –

1

Una semplice query di selezione restituisce solo ciò che è sul tavolo, non importa se è crittografato o meno.

Quindi, penso che non sia possibile farlo a livello di database.

Per il vostro requisito, è necessario un algoritmo di crittografia bidirezionale da utilizzare nell'applicazione, in modo da poter crittografare i dati prima di salvarli crittografati nel database e ottenere le informazioni crittografate dal database e decrittografarle nella propria applicazione.

2

Se si sa per quanto tempo il vostro campo di dati sarà, quindi è possibile utilizzare la versione statica che l'altra risposta produrrà, ma si può sempre creare una funzione per generare questo:

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 

Per questo funzione passerai nei valori che vuoi mascherare.Quindi la query sarebbe:

declare @temp table 
(
    col1 varchar(50) 
) 

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

select dbo.MixUpCharacters(col1) col1 
from @temp 

Vedi SQL Fiddle with Demo

Il risultato sarebbe:

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

O qui è un modo per farlo con CTE ricorsiva:

;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 

Vedi SQL Fiddle with Demo

1

molto semplice bro

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

uscita:

È ******* Ing

se è num tipo convertire in char

1

Se si desidera per mascherare un campo che non conosci della lunghezza del campo. È possibile aggiornare il codice di bluefeet come questo:

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 

è possibile verificare in questo modo:

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') 

RISULTATI:

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

Da SQL Server 2016+ si potrebbe usare Dynamic Data Masking funzione. esposizione dei dati

dinamici limiti dati di mascheratura sensibili mascherando ad utenti non privilegiati. La mascheratura dinamica dei dati aiuta a prevenire l'accesso non autorizzato a dati sensibili consentendo ai clienti di indicare la quantità di dati sensibili da rivelare con un impatto minimo sul livello dell'applicazione. È una funzione di protezione dei dati che nasconde i dati sensibili nel set di risultati di una query su campi di database designati, mentre i dati nel database non vengono modificati. Il mascheramento dinamico dei dati è facile da usare con le applicazioni esistenti, poiché le regole di mascheramento sono applicate nei risultati dell'interrogazione. Molte applicazioni possono mascherare i dati riservati senza modificare le query esistenti.

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

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

SELECT * FROM #tab; 

uscita:

╔════╦══════════════╗ 
║ 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; 

uscita:

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

LiveDemo