2013-05-30 12 views
7

Sto usando SQL 2000. Una colonna di stringhe 'Password' è presente in una tabella 'Utenti'. Ha circa 3k righe. Il mio requisito è quello di crittografare tutti i valori della colonna "Password". Inoltre, dovrei essere in grado di decodificare quei campi password crittografati ogni volta che è necessario.Criptare una colonna in SQL 2000 tramite codice o script SQL

Lo so, da SQL 2005 in poi, ci sono funzionalisti integrati per questi requisiti. Ma sono preoccupato per SQL 2000.

Si prega di suggerire se c'è un modo per raggiungere il mio requisito tramite codice VB o script SQL. NON con strumenti di terze parti. Ho cercato in molti posti ma senza successo.

Grazie.

+1

'VB6' o' VB.NET'? Ad ogni modo sono abbastanza sicuro che Google avrà un sacco di risultati per questo. Perché la crittografia deve essere reversibile comunque? È normale usare solo un hash unidirezionale. –

+0

VB6. I valori stringa devono essere prima crittografati. Ma, quando richiesto in futuro, si dovrebbe poter decifrare lo stesso valore crittografato con il valore di stringa originale. – Kings

risposta

5

Si potrebbe usare senza documenti PWDENCRYPT e PWDCOMPARE funzioni disponibili in SQL Server 2000 -

CREATE TABLE #USER 
(
    LOGIN_ID varchar(20), 
    UserPassword nvarchar(256) 
) 

-- Encrypt & Insert Password 
-- Note: You will have to write UPDATE on existing records 
INSERT #USER VALUES ('my_loginid', PWDENCRYPT('MyPassword1')) 


DECLARE @InputPassword VARCHAR(100) 
DECLARE @IsValid INT = 0 

-- Test for Correct Password 

SET @InputPassword = 'MyPassword1' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 


SELECT @IsValid AS 'Test1'; 

-- Test for Wrong Password 

SET @InputPassword = 'WrongPassword' 

SET @IsValid = (SELECT PWDCOMPARE(@InputPassword, UserPassword, 0) 
       FROM #USER 
       WHERE LOGIN_ID = 'my_loginid') 

SELECT @IsValid AS 'Test2' 

DROP TABLE #USER 

link di riferimento -

1

Le password vengono solitamente memorizzate con un hash a 1 via (ad esempio SHA1), il che significa che sono crittografate e non devono mai essere decifrate. Quando l'utente inserisce la password, il codice lo cancellerebbe e controllerebbe se il valore dell'hash fosse uguale al valore dell'hash nel database.

Tuttavia, sembra che sia necessario poter decodificare la password. Per questo ci sono diversi algoritmi asimmetrici (RSA, PGP, ecc.) In cui si dovrebbe avere una coppia di chiavi privata e pubblica. La chiave privata viene tenuta segreta, mentre la chiave pubblica può essere condivisa affinché altri possano crittografare le proprie informazioni prima di inviarle. Sembra che sia eccessivo, dal momento che solo il tuo codice VB6 ha bisogno di crittografare i dati e non terze parti. Pertanto, è possibile utilizzare semplicemente un algoritmo simmetrico (come Blowfish o TripleDES) in cui si utilizza la stessa passphrase (anziché una coppia di chiavi) per crittografare e decrittografare i dati. Tale passphrase potrebbe essere memorizzata in un file di configurazione sul server. Assicurati di tenerlo protetto da utenti non autorizzati.

Hai visto questo articolo? Usa TripleDES con una passphrase che suona esattamente come quello che ti serve. http://msdn.microsoft.com/en-us/library/ms172831(v=vs.80).aspx

1

Al giorno d'oggi è considerata una cattiva pratica solo per crittografare le password per conto proprio. Spesso una stringa arbitraria (chiamata "salt") viene aggiunta a ogni password e quindi viene applicata la crittografia. In linea di principio non importa in quale sequenza stai aggiungendo "sale" e criptato. Tutte queste combinazioni sono uguali come forza codifica:

HASH (Pass & Salt) OR HASH (HASH (Pass)+Salt)) OR HASH (HASH (Pass) + HASH (Salt))

sale è tenuto in tabella separata come plain-text. Un'altra cosa che puoi fare è crittografare lo stesso valore più volte di seguito. Un piccolo ritardo per un utente non sarà evidente, ma aumenterà lo sforzo necessario per forzare la password.

È anche una buona pratica denominare tabelle in modo che i nomi delle tabelle non possano essere indovinati. Rende gli attacchi ciechi più difficili quando non riescono a ottenere il tavolo con le password subito.

Per quanto riguarda un modo per crittografare la stringa.

SQL Server 2000 Nessuna funzione simmetrica incorporata. Ci sono 2 funzioni integrate asimmetriche: BINARY_CHECKSUM e CHECKSUM.

VB VB offre algoritmi già implementati e strumenti per eseguire la propria implementazione. L'articolo cui si riferisce @SuperFunkyMonkey ha collegamenti a Security.Cryptography Namespace. Un altro algoritmo simmetrico (quello che puoi decodificare) è Rijndael.

1

Lasciatemi iniziare sottolineando che hai menzionato che si trattava di una password. Un'adeguata protezione delle password è un argomento complesso, ma al minimo suggerisco di salarle e triturarle. SQL Server include una funzione di hash (pwdencrypt era in SQL Server 2000 ma non è stato documentato fino alle versioni successive. Le versioni più recenti includono Hashbytes che ha più opzioni), ma questa funzione di hash non è la più sicura e si dovrebbe guardare ad altri opzioni.

L'utilizzo di un hash anziché di una crittografia viola uno dei requisiti dichiarati per poter decrittografare quei campi crittografati, ma con le password normalmente è meglio non essere in grado di decrittografarli. (È possibile confrontare un valore hash con una password inserita dall'utente anche con la password, non è sufficiente decrittografarlo facilmente per ripristinare la versione in testo normale.)

Se si desidera crittografarli, guardare allo spazio dei nomi System.Security.Cryptography e alla classe Simple3Des in particolare per VB. C'è una documentazione qui e una procedura dettagliata sulla crittografia delle stringhe all'interno di un programma here.