0

私は c で pam モジュールを作成しました。次のコードにより、私の pam はこれを吐き出します。

sudo: pam_authenticate: モジュールが不明です

文字列の md5 ハッシュ値を取得しようとしています。

char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;
} 

そのようにコメントアウトすると機能します

char *str2md5(const char *str, int length) {
    int n;
    MD5_CTX c;
    /*unsigned char digest[16];
    char *out = (char*)malloc(33);

    MD5_Init(&c);

    while (length > 0) {
        if (length > 512) {
            MD5_Update(&c, str, 512);
        } else {
            MD5_Update(&c, str, length);
        }
        length -= 512;
        str += 512;
    }

    MD5_Final(digest, &c);

    for (n = 0; n < 16; ++n) {
        snprintf(&(out[n*2]), 16*2, "%02x", (unsigned int)digest[n]);
    }

    return out;*/
}

コードをコメントアウトすると、これが得られます..

DEBUG: 08217239
Authentication Code: 08217239
[sudo] password for richardw: 

pamを使用しているときにmd5ハッシュを取得しようとしているのは些細なことですが、私は何かに取り組んでおり、何らかの理由でpamが好きではありません。誰かが回避策を知っていますか?

4

1 に答える 1

1

シンボルのない共有オブジェクトを作成した可能性が非常に高いです。共有ライブラリをリンクするとき、リンカーは未解決のシンボルについて不平を言うことはありません。ライブラリをロードすると、残りのシンボルは既にロードされているシンボルを使用して解決されます。それでも不足しているシンボルがある場合、共有ライブラリのロードは中止されます。これは、PAM から表示されるエラーのもっともらしい原因です。

ディレクティブは、特定のシンボルの#include型をコンパイラに通知しますが、対応するオブジェクトがどこにあるかは通知しません。これらの関数が存在することをコンパイラに伝えることに加えて、リンカーにそれらの場所を伝える必要があります。gcc を使用している場合は-lssl、リンカーの呼び出しなどで不足している可能性があります。

于 2013-09-16T16:29:47.573 に答える