2017-10-14 14 views
3

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 
+0

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? –

+0

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

+0

Reconstruire une table arc-en-ciel revient essentiellement à forcer le hachage. Ce que l'attaquant pourrait faire de toute façon. –

Répondre

0

Si quelqu'un a eu accès à votre base de données, ils peuvent aussi gagner accéder à vos scripts s'ils sont sur le même serveur.