5

ターミナルでGCCとCCを使用してCとC++のソースファイルをコンパイルする方法を知っていますが、コンパイルしたら、これらのファイルにパスワードを含めても安全かどうかを知りたいです。

たとえば、ユーザー入力で123などの特定のパスワードを確認しましたが、コンパイルされたC /C++プログラムを逆コンパイルできるようです。

ソースを完全に非表示にしたまま、C / C ++ソースファイルをコンパイルする方法はありますか?そうでない場合は、入力を暗号化してパスワードと照合する小さな例を提供できますか?例:(SHA1、MD5)

4

6 に答える 6

5

いいえ、ソースファイルにパスワードを安全に含めることはできません。実行可能ファイルの文字列はプレーンテキストであり、テキストエディタを持っている人なら誰でも簡単にパスワードを確認できます。

それほど安全ではありませんが、一部の人を踏みにじるでしょうが、代わりに暗号化された文字列を保存することです。だから基本的に:

enc = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"

bool check() {
    pass = getPassFromUser();
    encpass = myHashingFunction(pass);
    return pass == encpass;
}

これは一部の人を思いとどまらせますが、それほど安全ではありません。アセンブリハッカーが実行可能ファイルの「enc」文字列を既知のクリアテキスト値を持つ別のsha256エンコード文字列に置き換えるのは比較的簡単です。

別の認証サーバーを使用している場合でも、偽の認証サーバーをセットアップして、プログラムをだましてこの偽の認証サーバーに接続することは難しくありません。

于 2010-06-14T09:52:51.507 に答える
4

SHA1を使用してハッシュを生成する場合でも、通常の方法(パスワードをチェックする関数を作成する)で実行すると、実行可能ファイルへのアクセス権を与えられた決定的または知識豊富なハッカーがそれを回避できるため、それほど安全ではありません。 (ハッシュを既知のハッシュに置き換えるか、checkPassword()呼び出しをtrueを返す呼び出しに置き換えます。

問題は、誰から保護しようとしているのかということです。あなたの弟、ハッカー、国際的なスパイ、産業スパイ?

コード(または構成ファイル)に含まれているハッシュでSHA1を使用すると、弟からのみ保護されますか?(シェアウェアの価格を支払う代わりに、わざわざプログラムをハッキングしようとすることができないカジュアルなコンピューターユーザーを読んでください)。この場合、プレーンテキストのパスワードまたはSHA1ハッシュを使用しても、ほとんど違いはありません(おそらく、数パーセント多くの人が気にしないでしょう)。

コードを他の何かに対して安全にしたい場合は、さらに多くのことを行う必要があります。セキュリティに関する本は良い出発点ですが、これを行う唯一の実際の方法は、保護技術が教えられているセキュリティクラスを受講することです。これは非常に特殊な分野であり、独自のバージョンをローリングすると逆効果になり、実際の保護が得られない可能性があります(ハッシュの使用は最初のステップにすぎません)。

于 2010-06-14T13:01:46.833 に答える
3

機密性の高い静的データをコード内に保持することはお勧めしません。そのために構成ファイルを使用できます。そこに好きなものを収納できます。

しかし、本当にそうしたい場合は、デバッガーで調査して変更することで、コードを簡単に変更できることを最初に覚えておいてください。ユーザーがアクセスできないプログラムのみがより安全であると見なすことができます(たとえば、Web サイト)。

(さまざまなサイトの)ログインパスワードの大部分は、データベースに平文で保存されるのではなく、MD5、SHA1、Blowfish などのアルゴリズムで暗号化されます。

OpenSSLライブラリのこれらのアルゴリズムのいずれかを使用することをお勧めします。

私がすることは、公開鍵暗号アルゴリズムを使用することです。私の意見では、ソフトウェア保護について話すときに 100% 確実なことは何もないため、クラックされるにはおそらくもう少し時間がかかります。

于 2010-06-14T10:51:17.517 に答える
2

それらをプレーンテキストとして保存すると安全ではありません。ファイルをダンプするか、文字列などのユーティリティを使用して実行可能ファイル内のテキストを見つけることができます。

何らかの方法でそれらをエンコードする必要があります。

于 2010-06-14T09:29:53.780 に答える
1

を使用して役立つコード サンプルを次に示しますOpenSSL

#include <openssl/evp.h>

bool SHA256Hash(const char* buf, size_t buflen, char* res, size_t reslen)
{
    if (reslen >= 32)
    {
        EVP_MD_CTX mdctx;

        EVP_MD_CTX_init(&mdctx);

        EVP_DigestInit_ex(&mdctx, EVP_sha256(), NULL);
        EVP_DigestUpdate(&mdctx, buf, buflen);
        EVP_DigestFinal_ex(&mdctx, res, &len);

        EVP_MD_CTX_cleanup(&mdctx);

        return (len == 32);
    }

    return false;
}

このサンプルをsystoolsライブラリから取得し、適応させる必要がありました。したがって、変更なしでコンパイルできるかどうかはわかりません。しかし、それはあなたを助けるはずです。

一部のパスワードのハッシュ値をバイナリに保存することが安全かどうかを判断するには、それが何のために必要なのかを知る必要があることに注意してください。

特別なパスワードが与えられない限り、プログラムの一部の機能が禁止されると予想される場合、それは役に立ちません。攻撃者は、保存されているパスワードを推測または反転しようとする代わりに、パスワード チェック コード全体を削除する可能性があります。

于 2010-06-14T10:22:21.330 に答える
0

パスワードとそのストレージを保護するためのハッシュ関数と暗号化方法を見つけてみてください。

于 2010-06-14T09:36:52.813 に答える