5

c++ のビルトイン ハッシュ関数は、パスワードをハッシュするのに十分安全ですか? 例えば下のようなもの。

#include <iostream>
#import <string>

int main ()
{
    std::hash <std::string> hash;

    std::string passwordGuess;
    unsigned long hashedPassword = 1065148159544519853; // hash of password

    std::cout << "Enter your password: ";
    std::cin >> passwordGuess;

    unsigned long hashedPasswordGuess = hash(passwordGuess);


    if (hashedPasswordGuess  == hashedPassword) {
        std::cout << "Password is correct!" << std::endl;
    } else {
        std::cout << "Password is wrong!" << std::endl;
    }
}

これは合理的に安全ですか?

4

2 に答える 2

20

このハッシュ関数は暗号化の目的で使用することを意図していないため、合理的に安全とは言えません。

実際には、暗号化の目的で使用されることを意図したハッシュ関数 (現在壊れている MD5、古き良き SHA1、さらには非常に新しい SHA3 など) でさえ、保存されたパスワードをハッシュするためのものではありません。これは、ハッシュが高速になるように設計されているためです。一方、パスワード セキュリティでは、ハッシュが漏洩した場合の被害を制限するために、低速に設計されたハッシュが必要です。

パスワードをハッシュするつもりなら、bcryptまたはPBKDF2の C++ (またはおそらく見つけやすいので C) の実装を調べる必要があります。私は、Crypto++が少なくとも後者を行うことを知っています。

パスワードのハッシュ化の詳細な分析については、パスワードを安全にハッシュする方法も参照してください。

于 2013-06-01T22:44:33.217 に答える
0

人々がパスワードのハッシュについて話すとき、それはハッシュテーブルの意味ではありません。パスワード ハッシュは一方向関数である必要があります。SHA1 などの暗号化ハッシュは、使用したいものです。

正しくハッシュするには多くのテクニックがあります。辞書攻撃を防ぐためにソルトを含める必要があります。そして、複数回 (4k から 16k) ハッシュしたいとします。

于 2013-06-01T22:47:55.637 に答える