Lors de mon précédent concert, nous avons stocké le mot de passe en tant que valeur hachée/cryptée/salée (en utilisant MD5 à ce moment) comme VARBINARY(32)
. Pour comparer le mot de passe plus tard, plutôt que d'essayer de déchiffrer le mot de passe, nous comparons la valeur cryptée + salée que nous avons stockée à la valeur cryptée + salée du mot de passe en cours de tentative. S'ils correspondaient, ils entraient, s'ils ne correspondaient pas, ils n'entraient pas.
Le travail de hachage a été fait dans le niveau intermédiaire (à la fois pour enregistrer le mot de passe initialement et pour comparer plus tard), mais un Exemple basé sur SQL Server (pour arrêter les grognements de Yahia, ce n'est pas pour vous dire la manière la plus sûre possible, je suis juste illustrer la méthodologie avec un exemple très léger. MD5 pas assez fort pour vous? Vous pouvez utiliser un autre et un algorithme plus complexe ainsi que des techniques de salage plus avancées, en particulier si vous effectuez le hachage dans le niveau d'application):
CREATE TABLE dbo.Users
(
UserID INT IDENTITY(1,1) PRIMARY KEY,
Username NVARCHAR(255) NOT NULL UNIQUE,
PasswordHash VARBINARY(32) NOT NULL
);
une procédure pour créer un utilisateur (aucune erreur manipulation ou prévention dupe, juste pseudo).
CREATE PROCEDURE dbo.User_Create
@Username NVARCHAR(255),
@Password NVARCHAR(16)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @salt NVARCHAR(16) = '$w0rdf1$h';
INSERT dbo.Users(Username, Password)
SELECT @Username,
CONVERT(VARBINARY(32), HASHBYTES('MD5', @Password + @Salt));
END
GO
Maintenant, une procédure pour authentifier un utilisateur.
CREATE PROCEDURE dbo.User_Authenticate
@Username NVARCHAR(255),
@Password NVARCHAR(16)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @salt NVARCHAR(16) = '$w0rdf1$h';
IF EXISTS
(
SELECT 1 FROM dbo.Users
WHERE Username = @Username AND
PasswordHash = CONVERT(VARBINARY(32), HASHBYTES('MD5', @Password + @salt))
)
BEGIN
PRINT 'Please, come on in!';
END
ELSE
BEGIN
PRINT 'You can keep knocking but you cannot come in.';
END
END
GO
vous aurait probablement En réalité, effectuer le hachage dans l'application, et de transmettre les valeurs de hachage en tant que VARBINARY (32) - ce qui rend beaucoup plus difficile à « renifler » le mot de passe en texte clair réel où que vous soyez. Et vous ne stockez peut-être pas le sel en texte brut avec le code, mais vous le récupérez ailleurs.
Ceci est certainement plus sûr que de stocker le mot de passe non crypté, mais il supprime la possibilité de récupérer le mot de passe. Gagnant-gagnant à mon avis.
Quelque chose comme ça? http://stackoverflow.com/questions/1191112/password-hashing-salt-and-storage-of-hashed-values – CodeCaster
Cela aide à hacher le mot de passe, mais dans quel type de données puis-je le stocker et comment puis-je travailler avec SecureStrings pour faire la comparaison par la suite? –
Le type de données devrait probablement être un varchar, et un SecureString n'est pas une solution magique, c'est simplement une chaîne protégée des attaques, vous ne pouvez pas lire son contenu de la mémoire depuis l'extérieur de votre programme, mais c'est tout. – CodeCaster