【问题标题】:How to use OpenSSL's SHA256 functions如何使用 OpenSSL 的 SHA256 函数
【发布时间】:2023-03-10 04:43:01
【问题描述】:

我正在编写一个程序来熟悉 OpenSSL、libncurses 和 UDP 网络。我决定使用 OpenSSL 的 SHA256 来熟悉行业加密标准,但我在让它工作时遇到了问题。我已将错误与 OpenSSL 与已编译程序的链接隔离开来。我正在使用 64 位的 Ubuntu 12.10。我已经安装了软件包 libssl-dev。

以 C++ main.cpp 为例:

#include <iostream>
#include <sstream>
#include <string>
#include <iomanip>
using namespace std;

#include <openssl/sha.h>

string sha256(const string str)
{
    unsigned char hash[SHA256_DIGEST_LENGTH];
    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, str.c_str(), str.size());
    SHA256_Final(hash, &sha256);
    stringstream ss;
    for(int i = 0; i < SHA256_DIGEST_LENGTH; i++)
    {
        ss << hex << setw(2) << setfill('0') << (int)hash[i];
    }
    return ss.str();
}

int main()
{

    cout << sha256("test") << endl;
    cout << sha256("test2") << endl;

    return 0;

}

我正在使用here 找到的 SHA256() 函数作为 OpenSSL 的 SHA256 功能的包装器。

当我尝试使用以下 g++ 参数进行编译时,我收到以下错误:

millinon@myhost:~/Programming/sha256$ g++ -lssl -lcrypto -o main main.cpp
/tmp/ccYqwPUC.o: In function `sha256(std::string)':
main.cpp:(.text+0x38): undefined reference to `SHA256_Init'
main.cpp:(.text+0x71): undefined reference to `SHA256_Update'
main.cpp:(.text+0x87): undefined reference to `SHA256_Final'
collect2: error: ld returned 1 exit status

因此,GCC 清楚地识别了 OpenSSL 定义的函数和类型,但 ld 无法找到 sha.h 中引用的函数符号。

我是否需要手动指向特定的共享对象或目录?

谢谢!

【问题讨论】:

    标签: c++ gcc openssl sha256


    【解决方案1】:

    您犯了一个非常常见的初学者错误...在构建时将链接的库放在命令行上的错误位置。

    依赖在命令行上是相反的,所以依赖于其他东西的东西实际上应该放在之前它依赖于命令行。

    在您的示例中,您有一个源文件 main.cpp 依赖于一组库,那么源文件应该位于它所依赖的库之前:

    $ g++ -o main main.cpp -lssl -lcrypto
    

    为了安全起见,始终将库放在最后,放在命令行上列出的任何源文件或目标文件之后。

    【讨论】:

    • 天哪,它成功了!谢谢!我已经使用 GCC 大约 7 年了,但我从未意识到命令行参数是这样工作的。
    • -o main 之后就足够了。很少有 Unix 程序要求你在参数之后加上选项,一般来说,IMO 是一种不好的做法。
    • @jcomeau_ictx:嗯?不,这还不够。它应该在引用这些库中的符号的源文件之后。即“在main.cpp 之后就足够了”。
    【解决方案2】:

    这在我的系统上运行良好,但您可以尝试:

    extern "C" {
    #include <openssl/sha.h>
    }
    

    它告诉 g++ openssl/sha.h 中的所有东西都被声明为“C”函数。

    顺便说一句,你的 OpenSSL 几岁了?

    【讨论】:

    • 我试过了,使用上面的 GCC 参数,我仍然收到同样的错误。 Joachim 的建议解决了这个问题。我正在使用 OpenSSL 版本 1.0.1c,作为记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2012-01-19
    • 2017-03-24
    • 2012-07-29
    相关资源
    最近更新 更多