Scrambling una password salata prima dell'hashing. Buona idea o inutile?

1

Sto aggiornando un sito legacy classico di ASP e ho bisogno di memorizzare le password, quindi naturalmente sono un po 'più cauto su come procedere, viste le limitazioni di Classic ASP.

Sto usando sia sale che pepe (il pepe è una costante memorizzata sul server, non nel database), e mi chiedo solo, c'è qualche vantaggio nel mischiare / rimescolare i personaggi del " pepe + password + sale "stringa prima di hashing?

Ho scritto una funzione che può scramble una stringa di qualsiasi lunghezza basata su una sequenza (segreta) predefinita di numeri (la sequenza è anche memorizzata sul server, non nel database). Quindi la funzione restituirà sempre lo stesso valore criptato piuttosto che un valore criptato casuale (che ovviamente non sarebbe utile).

Ho letto molto sulla salatura delle password, ma non ho mai visto nessuno suggerire che la password salata sia codificata prima dell'hashing. Ma per me questo sembra un grande livello extra di sicurezza.

Ti stai chiedendo cosa pensano gli altri?

Ecco la funzione di scramble (è scritta in 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 esempio della funzione precedente in azione

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 = "p@44w0rd"
salt = "G1sWNd0andiIhOYA"

concatenated pepper+password+salt:
XC3Qpm7CNXauwAbXp@44w0rdG1sWNd0andiIhOYA

scrambled using the example sequence:
NY@aI7NsduXAwmQG4dnd4rXXObppCW13CAhia00w

SHA512 Hash:
9d5a7781eeb815250c55c1a1f172c569b3b6167a48951c819e4982bea9b84bd8ecad6a417ff8f110541a1039ddf1fd8daa61a52a7c401fccae71dda77c607540

I sali sono memorizzati accanto alle password hash e il mio pensiero dietro questo metodo è che se un hacker è in grado di accedere al database, la ricostruzione di una tabella arcobaleno per il targeting di un singolo account implementando il sale sarebbe quasi impossibile dato la password + valore di sale è criptata e non solo concatenata, rendendo quasi impossibile l'uso di hashish (per non parlare dell'uso del pepe). L'hacker avrebbe bisogno di accedere al codice sorgente per tentare anche di forzare l'hash ... Mi rendo conto anche che concatenare una password + pepe + sale prima dell'ashing è lo standard accettato, ma ho pensato che questo potrebbe essere un bel livello extra di sicurezza, se non un po 'eccessivo.

    
posta user2597933 15.10.2017 - 14:19
fonte

1 risposta

5

But to me this seems like a great extra level of security.

Non penso che ciò dia una sicurezza aggiuntiva significativa. Se l'utente malintenzionato accede al codice e al segreto di scrambling, avrà bisogno dello stesso tempo di crackare le password come prima, perché questa funzione di scrambling non aumenta lo spazio di ricerca per la forza bruta. Anche se sono noti solo gli algoritmi ma non il segreto di scrambling, non sarà così difficile forzare il segreto assumendo che il database delle password sia grande e contenga le tipiche password banali. In altre parole: la tua idea si basa completamente sull'oscurità, cioè che sia l'algoritmo che la (breve!) Chiave di scrambling non sono noti all'attaccante.

E, se vuoi solo aggiungere più oscurità affidandosi ai segreti del server, è probabilmente più semplice allungare il pepe.

I metodi consolidati per archiviare le password si basano invece sull'utilizzo di metodi di hashing specificamente progettati per rallentare al fine di rallentare gli aggressori che tentano di eseguire brute-force degli hash delle password catturati e sono quindi affidabili anche se sono note sia le password con hash che il metodo hash. Vedi Come fare in modo sicuro le password di hash? per ulteriori informazioni.

    
risposta data 15.10.2017 - 15:03
fonte

Leggi altre domande sui tag