Шифрование соленого пароля перед хешированием. Отличная идея?

Я обновляю старый классический сайт ASP, и мне нужно сохранить пароль, поэтому, естественно, я слишком осторожен в том, как это сделать, учитывая ограничения классического ASP.

Я использую как соль, так и перец (перец - это константа, хранящаяся на сервере, а не в базе данных), и мне просто интересно, есть ли какая-либо польза от перетасовки / скремблирования символов "перец + пароль". + строка соли перед хешированием?

Я написал функцию, которая может шифровать строку любой длины на основе заранее определенной (секретной) последовательности чисел (эта последовательность также хранится на сервере, а не в базе данных). Таким образом, функция всегда будет возвращать одно и то же зашифрованное значение, а не случайное зашифрованное значение (которое, конечно, бесполезно).

Я много читал о солевом пароле, но я никогда не видел, чтобы кто-нибудь предлагал зашифровать солевой пароль перед хешированием. Но мне это кажется отличным дополнительным уровнем безопасности.

Просто интересно, что думают другие?

Вот функция скремблирования (она написана на 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

Пример вышеописанной функции в действии

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

person Adam    schedule 14.10.2017    source источник
comment
Цель солей — сделать радужные таблицы бесполезными (поскольку злоумышленнику придется пересчитывать их для каждого хеша, который он хочет взломать). Не имеет значения, известна ли соль злоумышленнику или нет. Какие преимущества дает вам ваш подход?   -  person Ansgar Wiechers    schedule 14.10.2017
comment
Я понимаю назначение соли (которая будет храниться рядом с хешированным паролем). Если база данных была скомпрометирована, хакер мог нацелиться на одну учетную запись и перестроить радужную таблицу, реализующую соль. Я думал, что шифрование пароля + соли, а не просто объединение двух, сделает это почти невозможным, если только у них нет доступа к исходному коду веб-сайта, а также к базе данных... Я также понимаю, что это излишество, но это просто казалось как хороший дополнительный уровень безопасности.   -  person Adam    schedule 14.10.2017
comment
Перестроение радужной таблицы, по сути, то же самое, что и перебор хэша. Что злоумышленник мог сделать в любом случае.   -  person Ansgar Wiechers    schedule 14.10.2017
comment
Я не уверен, что следую. Как кто-то может взломать хэш, если он не знает, как были объединены пароль пользователя и соль? И даже если бы они смогли взломать хэш, пароль был бы зашифрован в соль, так как же они смогли бы расшифровать его и получить пароль?   -  person Adam    schedule 14.10.2017
comment
Кроме того, я также использую перец, который не хранится в базе данных.   -  person Adam    schedule 14.10.2017
comment
Google Принцип Керкхоффа. Предположим, что злоумышленник знает, как сочетаются пароль и хэш. В любом случае, вы спрашивали, хорошая ли это идея. Мой ответ: нет, это не так. Делай с этим, что хочешь.   -  person Ansgar Wiechers    schedule 14.10.2017
comment
Спасибо за ваш отзыв, но я с уважением не согласен,   -  person Adam    schedule 14.10.2017
comment
Я был бы рад согласиться с тем, что это может быть ненужным шагом, но я не согласен с тем, что это не улучшает целостность хеша.   -  person Adam    schedule 14.10.2017
comment
@Adam Адам Это не сделает его менее безопасным, стоит оно того или нет, я не уверен, вы можете получить лучший ответ на Information Security Stack Обмен однако.   -  person user692942    schedule 15.10.2017
comment
Я голосую за то, чтобы закрыть этот вопрос как не относящийся к теме, поскольку он принадлежит обмену стеками информационной безопасности.   -  person user692942    schedule 15.10.2017
comment
Спасибо @Lankymart, я опубликую это там   -  person Adam    schedule 15.10.2017


Ответы (1)


Если кто-то получил доступ к вашей базе данных, он также может получить доступ к вашим сценариям, если они находятся на том же сервере.

person Eric Shawn    schedule 26.11.2017