SQL Server – Stockage du mot de passe

Je suis généralement assez prudent sur le stockage des informations sensibles et préfère utiliser un login Facebook / Twitter si possible afin qu'ils puissent gérer le mot de passe. Cependant, j'ai atteint un projet où il n'y a pas d'autre choix que de stocker un nom d'user / mot de passe dans la database et je voulais m'assurer que mon code que j'utilise est sans faille en termes de security.

J'ai écrit la procédure ci-dessous qui va générer le mot de passe haché et planifier de stocker le résultat de @strPassword et @strSalt contre la table de mes users.

Le site web / application mobile va alors hacher le mot de passe et le postr sur une connection HTTPS au service web qui va combiner le résultat haché avec le sel et le hacher à nouveau évidemment pour le comparer au mot de passe stocké dans ma table.

D'après les choses que j'ai lues cela devrait empêcher les tables arc-en-ciel d'être utilisées pour le déchiffrer, ainsi que l'utilisation de SHA512 qui devrait empêcher la force brute, et finalement HTTPS qui empêchera tout vol du mot de passe en transit. Et si un virus sur le périphérique client pouvait save une copy du mot de passe, il serait déjà partiellement haché.

Y a-t-il des failles potentielles ou existe-t-il un meilleur moyen d'y parvenir?

DECLARE @strPassword VARCHAR(128) DECLARE @strSalt VARCHAR(36) DECLARE @strHashMethod VARCHAR(10) = 'SHA2_512' SET @strPassword = HASHBYTES(@strHashMethod, 'MyPassword') SET @strSalt = CONVERT(VARCHAR(36), NEWID()) SET @strPassword = HASHBYTES(@strHashMethod, @strSalt + @strPassword) SELECT CONVERT(VARBINARY(128), @strPassword) 

On dirait sécurisé pour moi!

Vous pourriez lancer un count d'itération si vous en aviez envie, par exemple, faire une boucle 100 fois juste avant votre dernière ligne:

 SET @strPassword = HASHBYTES(@strHashMethod, @strPassword) 

Alternativement, le IC (nombre d'itérations) pourrait être un int random entre, disons, 100 et 1000, et stocké à côté du mot de passe haché et du sel dans la table sous-jacente.

Un peu bizarre d'utiliser NEWID () pour créer le sel. J'utiliserais probablement juste CRYPT_GEN_RANDOM (16).