5

Cでパスワードをソルトしてハッシュするライブラリまたはフレームワークを知っている人はいますか? プログラムでこれを行うにはどうすればよいですか?

4

4 に答える 4

7

私は間違いなくOpenSSLを使用します。暗号化に関しては、自分で作成しようとしたり、誰かがインターネットに投稿したものを見つけたりしないでください。毎日何百万人もの人々によって検証され、信頼されている OpenSSL のようなものを使用してください。私の意見では、自作で不適切に実装された暗号化は、インターネットでのセキュリティ侵害の主な原因です。

Tibor が述べたように、通常、ソルトはハッシュの前にパスワードに追加されます。ユニークな塩は、レインボー テーブル ベースの攻撃の能力を大幅に低下させます。

于 2012-04-23T00:27:48.780 に答える
5

Openssl API の使用をお勧めします

1.) パスワードを使用してキーを生成する場合は、次のPKCS5_PBKDF2_HMAC_SHA1()ように使用します

# include <openssl/evp.h>
int PKCS5_PBKDF2_HMAC_SHA1(const char *pass, int passlen,
                       unsigned char *salt, int saltlen, int iter,
                       int keylen, unsigned char *out);

また

int EVP_BytesToKey(const EVP_CIPHER *type,const EVP_MD *md,
                          const unsigned char *salt,
                          const unsigned char *data, int datal, int count,
                          unsigned char *key,unsigned char *iv);

2.) パスワードをハッシュするには、sha1 の代わりに sha256 を使用します (より安全な理由であり、sha1 セキュリティでの試行が既に行われています)

 # include <openssl/sha.h>
 SHA256_CTX context;
 unsigned char md[SHA256_DIGEST_LENGTH];

 SHA256_Init(&context);
 SHA256_Update(&context, (unsigned char*)input, length);
 SHA256_Final(md, &context);

この後、md にはパスワード ハッシュが含まれます。

3.) SALT: ソルトはいくつかのランダム バイトにすぎませんが、要点は、暗号化された安全なランダム バイトを使用することです。これには、次を使用できます。

# include <openssl/rand.h>

unsigned char salt[32];    //32 is just an example  
int RAND_bytes(salt,32);
于 2012-05-08T20:33:40.060 に答える
2

C には多くのハッシュ関数の実装があります。C で SHA1 アルゴリズムを検索することをお勧めします。これが唯一の暗号化機能である場合は、一部のスニペットをコピーするだけでかまいませんが、それ以外の場合は、OpenSSL や GNU Crypto などのより高度なライブラリを使用できます。

一方、ソルティングは通常、パスワードにソルトを追加するだけで行われます。つまり、(疑似コードで)pwhash=hash(password+salt)です。

于 2012-04-23T00:28:49.870 に答える
2

ハッシュ関数を備えた最も一般的な C 暗号ライブラリはOpenSSLBotanで、C++ を使用している場合はCrypto++です。さらに、ターゲットとするプラットフォームと使用するハッシュ関数に応じて、Windows 上の Win32 暗号化関数と、さまざまなプラットフォーム用のその他のネイティブ ライブラリがあります。

于 2012-04-23T00:36:32.623 に答える