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 回答