2010-03-03 8 views
2

Malheureusement, j'ai des mots de passe en clair dans une base de données. Je veux passer ces valeurs de texte en clair aussi peu que possible pour, disons, des comparaisons et des mises à jour. À cette fin, j'essaye de créer une vue de ma table d'utilisateurs qui exclut les mots de passe en clair et fournit à la place une valeur hachée de ce mot de passe.Puis-je concaténer une colonne virtuelle dans une vue?

Voici mon opinion actuelle SQL Server, ce qui ne fonctionne pas:

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
     HashBytes('SHA1', PasswordSalt + u.Password) AS PasswordHash 
FROM dbo.Users AS u 

Je serais heureux d'entendre parler des alternatives à cette approche, mais sinon le problème semble être concaténer la colonne virtuelle PasswordSalt avec .. rien. Par exemple, la vue simple suivante fonctionne:

SELECT u.Login AS Column1, u.Login + 'b' AS Column2 

mais celui-ci ne fonctionne pas:

SELECT u.Login AS Column1, Column1 + 'b' AS Column2 

L'erreur que je reçois de Management Studio est

nom de colonne non valide « Column1 '.

Merci d'avance pour toute idée de ce que je fais mal!

+0

Vous pouvez simplement chiffrer la colonne (SQL Server 2005+): http://msdn.microsoft.com/en-us/library/ms179331% 28SQL.90% 29.aspx –

+0

La seule façon de reproduire l'erreur était que la colonne 1 n'existait pas –

+0

J'ai choisi un hachage pour m'assurer que la transformation est reproductible par les consommateurs sans qu'ils puissent récupérer 'u.Password'. Je crois que cela exclut le cryptage. – ladenedge

Répondre

1

Le problème se produit car la clause FROM de votre instruction indique que les données à sélectionner proviennent de la table Users, mais que la partie SELECT fait référence à une colonne nommée PasswordSalt. SQL Server ne peut pas trouver une colonne portant ce nom dans la table Utilisateurs, d'où l'erreur.

Une autre approche peut être de générer le sel dans une sous-requête. Par exemple

SELECT x.PasswordSalt,  HashBytes('SHA1', x.PasswordSalt + x.Password) AS PasswordHash FROM (SELECT  CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt, Password FROM dbo.Users) x

+0

Cela a fait l'affaire! Merci pour la solution élégante! – ladenedge

1

Qu'en est-

SELECT CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) AS PasswordSalt 
     HashBytes('SHA1', CAST(CAST(32768 * RAND() AS INT) AS NVARCHAR) + u.Password) AS PasswordHash 
FROM dbo.Users AS u 
+0

Celui-ci semble problématique car je dois m'assurer que la colonne virtuelle * PasswordSalt * contient la même valeur que celle qui est hachée avec le mot de passe. Si elles diffèrent, les consommateurs ne seront pas en mesure de vérifier la correspondance des mots de passe. – ladenedge

+0

Je crois que peu importe combien de fois vous appelez Rand(), il retournera la même valeur pour chaque ligne de l'ensemble – unclepaul84

Questions connexes