Shat12通过OpenSSL在QT中散列

时间:2014-06-17 12:21:53

标签: c++ macos qt openssl sha512

我试图在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

请寻找跨平台解决方案。

3 个答案:

答案 0 :(得分:2)

您需要链接到正确的库(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/

答案 1 :(得分:1)

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

这看起来不正确。 OpenSSL库是libcrypto-lcrypto)和libssl ( - lssl ). There is no libopenssl (-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

答案 2 :(得分:0)

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

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

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

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

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

LIBS += -lcrypto

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