Je suis en train de mettre à jour un ancien site ASP classique et j'ai besoin de stocker un mot de passe, donc naturellement je suis un peu trop prudent sur la façon de faire cela étant donné les limitations de Classic ASP. J'utilise à la fois un sel et un poivre (le poivre est une constante stockée sur le serveur, pas dans la base de données), et je me demande simplement s'il est utile de mélanger/brouiller les caractères du "poivre + mot de passe + sel" chaîne avant le hachage?Brouillage d'un mot de passe salé avant le hachage. Bonne idée?
J'ai écrit une fonction qui peut brouiller une chaîne de n'importe quelle longueur en fonction d'une séquence de nombres (secrète) prédéfinie (la séquence est également stockée sur le serveur, pas dans la base de données). Ainsi, la fonction retournera toujours la même valeur brouillée plutôt qu'une valeur aléatoire brouillée (ce qui bien sûr serait inutile). J'ai beaucoup lu sur le mot de passe de salage, mais je n'ai jamais vu quelqu'un suggérer que le mot de passe salé soit brouillé avant le hachage. Mais pour moi, cela semble être un très bon niveau de sécurité supplémentaire.
Vous vous demandez simplement ce que les autres pensent?
est ici la fonction bousculade (il est écrit en VBscript):
Function ScrambleSalt(the_str)
'// Once you've joined the pepper + password + salt, you pass it through the "ScrambleSalt" function before
'// hashing. The "ScrambleSalt" function will scramble any string based on a pre-set sequence of numbers.
'// The sequence is imported from a txt file (kept in an offline folder, just like the pepper).
'// The sequence needs to be an incremental collection of numbers (starting from 1) but in a random order
'// and comma delimited. Here's and example with 1 to 50, although the actual sequence uses 1 - 500:
'// 22,8,21,45,49,42,3,36,11,47,19,9,15,23,40,16,29,31,43,38,44,4,41,13,35,26,17,14,10,28,6,5,34,12,39,1,
'// 30,46,32,7,27,48,33,25,18,2,50,20,24,37
'// (^ the numbers 1 to 50 in a random order)
'// How the scrambling process works (using the above example sequence) is by rearranging the characters in
'// the string so that characters 22 appears first, followed by character 8, then character 21 etc, etc...
'// the function cycles through the sequence ignoring any numbers that are larger than the length of the
'// string until the characters in the string have all been rearranged (scrambled).
'// If a string is more than 50 characters long, it will be split into individual strings, each containing
'// 50 characters (or a remainder in the case of the last string).
'// So if the length of the string is 120 characters long, it will be split into 3 string:
'// String 1 = 50 chars (chars 1 - 50)
'// String 2 = 50 chars (chars 51 - 100)
'// String 3 = 20 chars (chars 101 - 120)
'// Each string will be scrambled, then joined back together before being returned by the function.
'// Using this method means the function can scramble strings of any length and without limit.
Dim scramble_sequence, sequence_array, scramble_loop, in_loop_str, scrambled_str
scramble_sequence = file_get_contents(request.ServerVariables("APPL_PHYSICAL_PATH") & "/../keys/scramble_sequence.txt")
sequence_array = split(scramble_sequence,",")
scramble_loop = Ceil(len(the_str),uBound(sequence_array)+1) '// round up
for fx = 0 to scramble_loop-1
in_loop_str = mid(the_str,fx*(uBound(sequence_array)+1)+1,uBound(sequence_array)+1)
for fy = 0 to uBound(sequence_array)
if int(sequence_array(fy)) =< len(in_loop_str) then
scrambled_str = scrambled_str & mid(in_loop_str,int(sequence_array(fy)),1)
end if
next
next
ScrambleSalt = scrambled_str
End Function
function Ceil(dividend, divider) ' for rounding up a number
if (dividend mod divider) = 0 Then
Ceil = dividend/divider
else
Ceil = Int(dividend/divider) + 1
end if
End function
function file_get_contents(file_path)
Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile(file_path,1)
file_get_contents = f.ReadAll
f.Close : Set f = Nothing : Set fs = Nothing
end function
Un exemple de la fonction ci-dessus en action
pepper value used for this example = "XC3Qpm7CNXauwAbX"
scramble sequence used for this example = "9,39,50,43,18,11,36,7,29,41,27,34,12,45,1,14,42,13,6,4,25,19,24,33,30,20,23,10,46,16,49,38,15,5,17,8,47,28,26,3,2,40,37,44,35,32,48,22,31,21"
password = "[email protected]"
salt = "G1sWNd0andiIhOYA"
concatenated pepper+password+salt:
[email protected]
scrambled using the example sequence:
[email protected]
SHA512 Hash:
9d5a7781eeb815250c55c1a1f172c569b3b6167a48951c819e4982bea9b84bd8ecad6a417ff8f110541a1039ddf1fd8daa61a52a7c401fccae71dda77c607540
Le but des sels est de rendre les tables arc-en-ciel inutiles (parce qu'un attaquant devrait les recalculer pour chaque hash qu'il veut fissurer). Que le sel soit connu de l'attaquant ou non est sans importance. Quel avantage votre approche vous apporte-t-elle? –
Je comprends le but d'un sel (qui sera stocké à côté du mot de passe haché). Si la base de données était compromise, un pirate pourrait cibler un seul compte et reconstruire une table arc-en-ciel pour mettre en œuvre le sel. Je pensais que brouiller le mot de passe + sel plutôt que de concaténer les deux rendrait cela presque impossible, pas à moins qu'ils aient accès au code source du site ainsi qu'à la base de données ... Je réalise aussi que c'est exagéré, mais ça semblait juste comme un bon niveau de sécurité supplémentaire. – Adam
Reconstruire une table arc-en-ciel revient essentiellement à forcer le hachage. Ce que l'attaquant pourrait faire de toute façon. –