【问题标题】:Sha512 hash in QT via OpenSSL通过 OpenSSL 在 QT 中的 Sha512 哈希
【发布时间】:2014-06-17 12:21:52
【问题描述】:

我正在尝试在 openSSL 中使用 Sha512 函数,但似乎无法让它工作,因为我刚开始编写代码时遇到编译器错误。我在 .cpp 文件的顶部包含 #include <openssl/sha.h>,然后在按钮事件的操作中,我只在下面添加了以下代码。

SHA512_CTX ctx;
SHA512_Init(&ctx);

//Will uncomment below in later if I get SHA512_Init to work

//SHA512_Update(&ctx, string, strlen(string));
//SHA512_Final(digest, &ctx);

我收到一个链接器错误,告诉我架构 x86_64 的未定义符号,暗示该函数不存在?

我知道 QT 5 有一个散列函数,但我仅限于 QT 4.8,所以我不能使用 QT 5+ 框架中提供的加密 sha512 散列函数。

感谢任何帮助!

使用macports安装openssl

我使用的是 Mac OS 10.9.2

制作文件

#-------------------------------------------------
#
# Project created by QtCreator 2014-06-11T20:27:49
#
#-------------------------------------------------

QT       += core gui network

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = ExchangeTab
TEMPLATE = app

LIBS += -L/usr/include/openssl -openssl
INCLUDEPATH += /usr/include/openssl

SOURCES += main.cpp\
        mainwindow.cpp \
    httpsocket.cpp \
    cloaksend.cpp \
    exchange.cpp

HEADERS  += mainwindow.h \
    httpsocket.h \
    cloaksend.h \
    exchange.h

FORMS    += mainwindow.ui

RESOURCES += \
    AppResources.qrc

请寻找跨平台解决方案。

【问题讨论】:

  • 链接器错误意味着您没有链接到正确的库。请在您的问题中包含您的 make-/cmake-file。另外,请说明您使用的是什么操作系统。
  • Mac OS 10.9.2,我将在几秒钟内包含 make 文件。
  • 根据要求提供文件。感谢您的关注!
  • 经过一些研究后,我认为我的问题可能是我没有在 makefile 中使用 LIBS 或 INCLUDEPATH,不知道如何为 openSSL 执行此操作或在哪里安装 openSSL。我使用 macports 安装最新的 openSSL

标签: c++ macos qt openssl sha512


【解决方案1】:

你需要链接到正确的库(openSSL)

看看这里:How to Include OpenSSL in a Qt project

具体来说,将其添加到您的 .pro 文件中。:

LIBS += -L/opt/local/lib/ -lcrypto

要包含 .h 文件,请将此行添加到您的 .pro 文件中:

INCLUDEPATH += /opt/local/include

[1] 表示默认包含路径为/opt/local/include/

【讨论】:

  • 我实际上只是在看那里,但我不确定 mac 的包含路径是什么,有什么想法吗?我编辑了我的 makefile 以显示我认为的路径,但仍然无法正常工作,同样的链接器错误。你肯定走在正确的轨道上。
  • 它应该在/opt/local/include附近。并且库路径将是/usr/local/lib 应该说使用macports安装时。
  • 仍然无法正常工作,这是我尝试过的 LIBS += -L/opt/local/include/ -openssl INCLUDEPATH += /opt/local/include/ 我正在其他地方阅读以实现此目的跨平台友好我可能不得不使用名为 OPENSSL_LIB_PATH 的东西,知道那是什么吗?我还尝试在 libs 部分将它转到 /usr/local/lib,甚至在终端中导航以查看文件是否确实存在,openssl 确实确实存在于没有 .h 的奇怪地方(刚刚意识到它是一个目录.h 文件)。
【解决方案2】:
LIBS += -L/usr/include/openssl -openssl
INCLUDEPATH += /usr/include/openssl

这看起来不正确。 OpenSSL 库是libcrypto (-lcrypto) 和libssl (-lssl). There is nolibopenssl(-lopenssl)。试试:

LIBS += -L/usr/lib -lcrypto
INCLUDEPATH += /usr/include/openssl

但库是 0.9.8 版。您可以考虑升级到 1.0.1h。

$ ls /usr/lib | grep crypto
libcrypto.0.9.7.dylib
libcrypto.0.9.8.dylib
libcrypto.dylib
libk5crypto.dylib

$ /usr/bin/openssl version
OpenSSL 0.9.8y 5 Feb 2013

如果您选择升级,OpenSSL 将安装到/usr/local/ssl。避免将 OpenSSL 的版本与以下内容混合/匹配。

INCLUDEPATH += /usr/local/ssl/include/openssl
LIBS += /usr/local/ssl/lib/libcrypto.a

可以在LIBS 中指定对象和档案。见How to add object files to a project in Qt

【讨论】:

  • 谢谢。看起来您帖子中的 -lcrypto 似乎是我找到的解决方案的关键。我很好奇您能否解释一下为什么我的解决方案有效?
【解决方案3】:

好的,所以我可能已经回答了我自己的问题,但我需要一些帮助来理解它为什么起作用。

我的 make 文件确实是问题所在。我添加了以下 3 行。

INCLUDEPATH += $$OPENSSL_INCLUDE_PATH
LIBS += $$join(OPENSSL_LIB_PATH,,-L,)
LIBS += -lcrypto

然后它神奇地编译得很好。我在另一个使用 QT 为 OpenSSL 编译的项目中找到了这些。

很有趣。我删除了前两行,所以只剩下以下几行。然后对我的项目运行 clean 以确保正在重新编译代码。

LIBS += -lcrypto

这也只是“工作”而没有链接器错误。看起来这是我需要的唯一命令。问题是...如果我采用此代码并在 linux 或 windows 上编译,这将是跨平台友好的吗?我不确定,但这有效。

【讨论】:

  • 是的,它应该是跨平台友好的。但是,您需要一种自动查找 lib-path 的方法。
  • 我不确定在这种情况下选择什么作为正确答案,但我确实有另一个问题,您也可以提供帮助。它位于 (stackoverflow.com/questions/24266505/…)。我让 SHA 工作,现在只是想让它与 HMAC 一起工作。我想我几乎明白了,也许你能帮我解决我做错了什么?非常感谢到目前为止的所有建议!真的很有帮助!
猜你喜欢
  • 2018-06-07
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-29
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多