2017-10-14 2 views
3

Ich aktualisiere eine alte klassische ASP-Site und ich muss ein Passwort speichern, also bin ich natürlich ein bisschen übermäßig vorsichtig darüber, wie man angesichts der Einschränkungen von Classic ASP vorgeht.Zerstückelung eines gesalzenen Kennworts vor dem Hashing. Gute Idee?

Ich benutze sowohl ein Salz als auch einen Pfeffer (der Pfeffer ist eine Konstante auf dem Server gespeichert, nicht in der Datenbank), und ich frage mich nur, gibt es irgendwelche Vorteile zu mischen/scramble die Charaktere der "pepper + password + salt" Zeichenkette vor dem Hashing?

Ich habe eine Funktion geschrieben, die eine Zeichenfolge beliebiger Länge basierend auf einer vordefinierten (geheimen) Zahlenfolge verschlüsseln kann (die Sequenz ist auch auf dem Server gespeichert, nicht in der Datenbank). Die Funktion liefert also immer den gleichen verschlüsselten Wert und nicht einen zufälligen verschlüsselten Wert (was natürlich nutzlos wäre).

Ich habe viel über das Passwort-Salzen gelesen, aber ich habe noch nie jemanden gesehen, der darauf hinwies, dass das gesalzene Passwort vor dem Hashing verschlüsselt wird. Aber für mich scheint das ein großes Extra an Sicherheit zu sein.

Ich frage mich nur, was andere denken?

Hier ist die Verschlüsselungsfunktion (es in VBscript geschrieben):

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 

Ein Beispiel für die obige Funktion in Aktion

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

Der Zweck von Salzen ist, Rainbow-Tabellen unbrauchbar zu machen (weil ein Angreifer sie für jeden Hash, den sie knacken wollen, neu berechnen müsste). Ob das Salz dem Angreifer bekannt ist oder nicht, spielt keine Rolle. Welchen Vorteil bringt Ihre Herangehensweise? –

+0

Ich verstehe den Zweck eines Salzes (das neben dem Hash-Passwort gespeichert wird). Wenn die Datenbank kompromittiert wurde, konnte ein Hacker auf ein einzelnes Konto zugreifen und eine Rainbow-Tabelle erstellen, die das Salz implementierte. Mein Gedanke war, dass es nicht praktisch wäre, das Passwort + salt zu verschlüsseln, anstatt nur die beiden zu verketten, es sei denn, sie haben Zugriff auf den Quellcode der Website und auf die Datenbank ... Ich weiß auch, dass dies Overkill ist, aber es schien einfach wie ein gutes zusätzliches Sicherheitsniveau. – Adam

+0

Der Wiederaufbau einer Rainbow-Tabelle ist im Wesentlichen der gleiche wie das Brute-Forcing des Hashs. Was der Angreifer ohnehin tun könnte. –

Antwort

0

Wenn jemand Zugriff auf Ihre Datenbank gewonnen hat, können sie auch gewinnen Zugriff auf Ihre Skripte, wenn sie sich auf demselben Server befinden.

Verwandte Themen