2017-10-14 12 views
3

古典的なASPサイトを更新しているので、パスワードを保存する必要があります。当然、私はClassic ASPの限界を考えれば、これについてどうやって対処するかについては慎重すぎています。ハッシングの前に塩漬けされたパスワードをスクランブルする。良いアイデア?

私は塩と唐辛子の両方を使用しています(唐辛子はデータベースではなくサーバーに保存されている定数です)、私はちょっと疑問ですが、シャッフル/スクランブリングハッシュの前に "pepper + password + salt"文字列?

私は、あらかじめ定義された(秘密の)数字のシーケンスに基づいて任意の長さの文字列をスクランブルできる関数を書いています(シーケンスはデータベースではなくサーバーにも格納されています)。したがって、関数はランダムなスクランブルされた値ではなく、常に同じスクランブルされた値を返すようになります(もちろん、これは役に立たないでしょう)。

私はパスワードソルトについて多くのことを読んできましたが、ハッシュする前に塩漬けされたパスワードがスクランブルされていることは誰も見たことがありません。しかし、私にとってこれはセキュリティの偉大な余分なレベルのようです。

ほかの人が何を考えているのだろうか?誰かがあなたのデータベースへのアクセスを獲得した場合

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 = "[email protected]" 
salt = "G1sWNd0andiIhOYA" 

concatenated pepper+password+salt: 
[email protected] 

scrambled using the example sequence: 
[email protected] 

SHA512 Hash: 
9d5a7781eeb815250c55c1a1f172c569b3b6167a48951c819e4982bea9b84bd8ecad6a417ff8f110541a1039ddf1fd8daa61a52a7c401fccae71dda77c607540 
+0

塩の目的は、レインボーテーブルを無駄にすることです(攻撃者は、クラックしたい各ハッシュに対してそれらを再計算する必要があるためです)。塩が攻撃者に知られているかどうかは関係ありません。あなたのアプローチはあなたにどんな利点をもたらしますか? –

+0

私は塩の目的を理解しています(これはハッシュされたパスワードの隣に保存されます)。データベースが侵害された場合、ハッカーは単一のアカウントをターゲットにして、塩を実装するレインボーテーブルを再構築することができます。私の思考は、パスワードと塩だけではなく、2つのものを連結するのではなく、これを不可能に近づけることでした。ウェブサイトのソースコードやデータベースにアクセスできない限りではありません。優れたセキュリティレベルが得られます。 – Adam

+0

レインボーテーブルを再構築することは、本質的にハッシュを強制することと同じです。とにかく攻撃者ができること。 –

答えて

0

、彼らも得ることができます:ここで

は(それはVBScriptで書かれている)スクランブル機能ですスクリプトが同じサーバー上にある場合は、そのスクリプトにアクセスできます。

関連する問題