2

パスワードハッシュについて質問があります。http://crackstation.net/hashing-security.htmですばらしいチュートリアルを見つけました。これは、このコードを使用してパスワードからハッシュを作成する方法です。

$hashed_password = create_hash(form_password);

このコードの問題は、同じパスワードに対して毎回異なるハッシュを作成することです。パスワードにランダムなソルトを追加したためだと思います。

function create_hash($password)
{
    // format: algorithm:iterations:salt:hash
    $salt = base64_encode(mcrypt_create_iv(PBKDF2_SALT_BYTES, MCRYPT_DEV_URANDOM));
    return PBKDF2_HASH_ALGORITHM . ":" . PBKDF2_ITERATIONS . ":" .  $salt . ":" .
        base64_encode(pbkdf2(
            PBKDF2_HASH_ALGORITHM,
            $password,
            $salt,
            PBKDF2_ITERATIONS,
            PBKDF2_HASH_BYTES,
            true
        ));
}

そのため、ログイン時にユーザーが入力したパスワードから作成されたハッシュとデータベースから取得されたハッシュを比較することはできません。そのハッシュはデータベースに保存されているものと同じになることはないからです。それができると私が思う唯一の方法は、塩を別の列に保管することです、または私は間違っていますか?

物事も私を悩ませます。速攻の形式は、たとえば、sha256:1000:u9p + OqAZgVkIBtlTBkr9ZxhFvtt + zjcA:PvhJY + oesrdBeD5pjeXMQ/3wficCU0EGです。ハッカーは明らかにこの形式のハッシュを知っているので、このハッシュを作成したアルゴリズムは彼にとって明らかです。データベースが侵害され、これらのハッシュコードが何千も公開されたとしましょう。この形式のハッシュコードを使用すると、セキュリティの問題が発生しませんか?単純なOqAZgVkIBtlTBkr9ZxhFvtt+zjcA:PvhJY + oesrdBeD5pjeXMQ / 3wficは、暗号化メカニズムについて何も明らかにしないため、より良いと思います。

4

4 に答える 4

4

ここでウィキペディアへのこのリンクを読んでください

ランダムソルトの使用について詳しく説明しています。そこにある重要な情報は、ランダムソルトがハッシュされたパスワードと同じデータベースに保存されているということです。ユーザーがパスワードを作成または変更したときに、ランダムに作成されるのは数回だけです。認証が必要な場合に使用されます。

パスワードハッシュの作成に使用したアルゴリズムに関する情報を残すと、ユーザーの邪魔をすることなく、将来のある時点でアルゴリズムを変更するオプションが残ります。ハッシュアルゴリズムをアップグレードすることにした場合は、ユーザーがログインするまで待ちます。その時点で、パスワードはプレーンテキストになっています。古いアルゴリズムに対して認証したら、新しいハッシュを再ハッシュしてデータベース行に保存します。すべてのユーザーがログインするのに数か月から数年かかる場合がありますが、ログインすると、より優れたハッシュのメリットが得られます。したがって、ログインしてセキュリティの向上に関する特別なニュースを読むように依頼する電子メールを送信します(そして、副作用として、ハッシュ化されたパスワードを改善します)。

これがパスワードハッシュの興味深い議論ですStackOverflow:Passwords StorageHash..。

于 2013-01-25T20:22:16.523 に答える
4

同じパスワードの2つのハッシュが一致しない理由は、の結果にcreate_hash()ランダムに生成されたソルトが含まれているためです。

同じハッシュを取得するには、検証時にソルトを提供する必要があります。CrackStation.netが提供するコードにより、これは非常に簡単にcreate_hash()なります。結果をそのままデータベースに保存するだけです。ユーザーが正しいパスワードを入力したことを確認するには、

validate_password('provided-password','hash-from-database');

これにより、パスワードが正しいかどうかのブール値が返されます。この方法を使用すると、独自に作成するよりも優れています。これは、回答を返すのにかかる時間に基づいて正しいパスワードが何であるかについての特定のヒントを防ぐように特別に設計されているためです。これは小さな弱点ですが、特に提供されている関数が自動的に処理するため、とにかく回避することをお勧めします。

提供されている関数は確実な実装を提供するので、あまり混乱させないでください。ハッシュには、既存のユーザーのログイン機能に影響を与えることなくハッシュを将来変更できるようにするために、これらの追加の詳細(sha256:1000)が含まれています。現在のメソッドが何であっても、ハッシュで提供されているメソッドを使用するだけです。

潜在的な攻撃者にハッシュがどのように作成されたかを示す限り、フォーマットはどのように作成されたかについてすべてを示しますが、これはまったく重要ではありません。攻撃者は、1つまたは2つの既知のパスワード:ハッシュペアから使用される方法を簡単に理解できます。これよりもはるかに重要なのは、優れたアルゴリズムを使用することです。隠すことによるセキュリティはセキュリティが不十分であるため、詳細をすべて含めてもパスワードを解読することを困難または不可能にすることが目標です。

最後に、繰り返しになりますが、ソルトを別の列に格納する必要はありません。返される70〜80文字の大きなチャンクをハッシュとしてそのままにして、関数にすべてを処理させます。それ以外は無駄です。時間とリソースの

于 2014-08-10T18:31:03.003 に答える
1

受け入れられた優れた回答にもう少し追加するには:

ハッシュをソルトすることのポイントは、誰かが事前に暗号化されたハッシュの巨大な山を持って来て、それらを1つずつ試すことができないようにすることです。データベースにソルトが含まれている場合でも、ハッシュと正常に一致させるには、可能なすべての辞書エントリをそのソルトに対してハッシュする必要があります。また、重複エントリを防ぐために、ソルトは毎回異なる必要があります(1つのパスワードをハッキングし、他のユーザーが入力したのと同じパスワードを使用します)。

ログインハッシュを保存されたハッシュと比較できないことに関しては、それは意図的なものです。文字列比較関数ではなく、検証機能を使用してログインパスワードを保存されたパスワードと照合します。

于 2014-01-23T17:48:58.503 に答える
1

ソルトを保存し、パスワードにソルトを追加してからハッシュに変換して保存します。

次に、ソルトを取得してパスワードに追加するパスワードを比較するには、それをハッシュに変換してから、2つのハッシュを比較します。

(Pythonの例では、コードからコードをコピーするとインデントが台無しになります)

def Createpassword():
import random
import hashlib
username = input("type your username")
newpassword = input("type your new password? ")
#adds some salt
b = random.randint(1, 2000000000000)
randomsalt = str(b)

saltedpassword = (newpassword + randomsalt)

#hashes the newpassword

saltedpassword = saltedpassword.encode('utf-8')   
h = hashlib.sha256(saltedpassword)
finsh = h.hexdigest()

#creates file names
saltname = username + "salt.txt"
username = username + ".txt"


#saves the hashedpassword and the salt
text_file = open(username, "w")    
text_file.write(finsh)
text_file.close()
text_file = open(saltname, "w")    
text_file.write(randomsalt)
text_file.close()
print("your new password has been saved")

def EnterPassword():
    trys = 0
    while (trys < 3):
            username = input("type your username: ")
            #takes password input
            password = input("type your password: ")

            #gets file names
            saltname = username + "salt.txt"
            username = username + ".txt"

            #opens salt file
            text_file = open(saltname, "r")
            salt1 = text_file.read(50)
            text_file.close()
            #opens the hashed passwords file
            text_file = open(username, "r")
            correctpassword = text_file.read(500)
            text_file.close()

            #adds the salt to the password input
            saltedpassword = password + salt1


            #hashes the saltedpassword
            saltedpassword = saltedpassword.encode('utf-8') 
            m = hashlib.sha256(saltedpassword)
            hashedpassword = m.hexdigest()

            #compears hashed passwords

            if hashedpassword != correctpassword:
                    trys += 1
                    print("your password or username is incorrect")
            if trys == 3:
                    print("you have been locked out for using to many failed trys")
            if hashedpassword == correctpassword:
                    print ("Password Correct ")
                    #done give access
                    trys = 0
                    break

(私はプログラミングに不慣れなので、遠慮なく訂正してください)

于 2017-03-01T09:41:54.047 に答える