我需要在我的C++应用程序中存储敏感信息(我想保密的对称加密密钥).简单的方法是这样做:
std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";
但是,通过该strings过程(或从二进制应用程序中提取字符串的任何其他应用程序)运行应用程序将显示上述字符串.
应使用哪些技术来掩盖这些敏感数据?
编辑:
好的,所以你们所有人都说"你的可执行文件可以进行逆向工程" - 当然!这是我的一个宠儿,所以我要在这里咆哮:
为什么99%(好吧,或许我夸大一点)这个网站上所有与安全相关的问题都会被"没有可能的方法来创建一个完全安全的程序"所回答 - 这不是一个有用的回答!安全性是完美可用性与一端无安全性之间的滑动尺度,完美的安全性,但另一方面没有可用性.
关键在于,您可以根据您要执行的操作以及运行软件的环境来选择滑动比例.我不是在为军事装置编写应用程序,我正在为家用PC编写应用程序.我需要使用预先知道的加密密钥在不受信任的网络上加密数据.在这些情况下,"通过默默无闻的安全"可能已经足够了!当然,有足够时间,精力和技能的人可以对二进制文件进行逆向工程并找到密码,但猜猜是什么?我不在乎:
实施顶级安全系统所花费的时间比破解版本的销售损失更为昂贵(不是说我实际上是卖这个,但你明白了我的意思).在新程序员的编程中,这个蓝天"让我们尽可能做到绝对最好的方式"的趋势至少可以说是愚蠢的.
感谢您抽出宝贵时间回答这个问题 - 他们最有帮助.不幸的是,我只能接受一个答案,但我已经投了所有有用的答案.
我使用PHP levenshtein函数比较字符串有一些成功.
但是,对于包含已交换位置的子串的两个字符串,算法会将这些字符串计为全新的子字符串.
例如:
levenshtein("The quick brown fox", "brown quick The fox"); // 10 differences
Run Code Online (Sandbox Code Playgroud)
被视为没有共同点:
levenshtein("The quick brown fox", "The quiet swine flu"); // 9 differences
Run Code Online (Sandbox Code Playgroud)
我更喜欢一种算法,它看到前两个更相似.
我怎么能想出一个比较函数,它可以识别将位置切换为与编辑不同的子串?
我想到的一种可能的方法是在比较之前将字符串中的所有单词按字母顺序排列.这使得单词的原始顺序完全脱离了比较.然而,这样做的一个缺点是,只更改一个单词的第一个字母可能会造成比单个字母更改所造成的更大的中断.
我想要实现的是比较两个关于自由文本字符串的人的事实,并决定这些事实表明相同事实的可能性.事实可能是有人上学的学校,例如雇主或出版商的名字.两个记录可能有相同的学校拼写不同,单词的顺序不同,额外的单词等,所以如果我们要好好猜测他们指的是同一所学校,那么匹配必须有些模糊.到目前为止,它在拼写错误方面表现得非常好(我使用的是一种类似于metaphone的phoenetic算法),但是如果你改变学校中常见的单词顺序则非常糟糕:"xxx college"vs "xxx学院".
在阅读了关于算法和数据结构的入门书之后,我现在想要了解如何将这些结合起来以获得最佳效率的示例.
例如,您可以将散列图与特定排序算法结合使用,以创建简单的文本搜索程序.
这有什么好书或在线资源吗?
(我已经订购了编程珍珠,看起来很棒,但我想了解更多.)
以下两段代码之间是否有任何差异?他们中的任何一个比另一个更好吗?
运算符=
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo = boost::shared_ptr<Blah>(new Blah()); // Involves creation and copy of a shared_ptr?
Run Code Online (Sandbox Code Playgroud)
重启
boost::shared_ptr<Blah> foo; // foo.ptr should be NULL
foo.reset(new Blah()); // foo.ptr should point now to a new Blah object
Run Code Online (Sandbox Code Playgroud)
注意:我需要定义shared_ptr然后将其设置在不同的行中,因为我在一段代码中使用它,如:
boost::shared_ptr<Blah> foo;
try
{
foo.reset...
}
foo...
Run Code Online (Sandbox Code Playgroud) 在 Linux 上使用 CMake 构建之后(但在安装之前),所有链接库都将添加到最终可执行文件的 RPATH 中。
但是,我想在此 RPATH 前面添加。 $ORIGIN/../lib:
到目前为止,我只能替换RPATH,这不是我想要的:我想ld.so首先查看../lib. 这就是我目前所做的:
set_target_properties(foo PROPERTIES
BUILD_WITH_INSTALL_RPATH TRUE
INSTALL_RPATH "\$ORIGIN/../lib:...")
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但它缺少一些额外的第三方库,这些库不属于我的构建树,并且不位于系统目录中。
这样做chrpath -l foo给了我与上面完全相同的结果INSTALL_RPATH。如果我不设置这些属性,我会得到一长串 DSO 位置,例如RPATH=/bar/baz/:/quux/等(我想添加到前面的那个)。
我尝试过使用get_property(_existing_rpath foo INSTALL_RPATH),但这给了我一个空字符串
我已阅读https://cmake.org/Wiki/CMake_RPATH_handling上的提示,并在“CMake Bugs”下注意到
至少在 CMake 2.6.4 RHEL5 上, INSTALL_RPATH_USE_LINK_PATH 的 man cmakecommands 假装此设置会将链接路径附加到指定的任何 CMAKE_INSTALL_RPATH 内容。但是,在此版本上,启用 INSTALL_RPATH_USE_LINK_PATH 将取代它。
好吧,对此不再那么确定:刚刚在 CMake 2.8.0 上验证了这一点,现在在两个版本上它都列出了 cmake_install.cmake 中的正确更改。发生此错误的原因可能是之前未执行每个目标 install(),或者可能是由于 CMake RPATH 相关变量中的一些其他更改所致。
顺便说一句,我只对为构建的文件获取有效的 RPATH …
我已经成功创建了一个在不使用身份验证时正常工作的WS客户端.
但是,服务器(WebSphere)现在需要添加一个ws-security用户名令牌,而我很难做到这一点.生成的SOAP消息应该看起来像这样:
<soapenv:Envelope
xmlns:ns="http://foo.bar/1.0"
xmlns:ns1="http://www.witsml.org/schemas/140"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security soapenv:mustUnderstand="1" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<wsse:UsernameToken wsu:Id="UsernameToken-2" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<wsse:Username>foo</wsse:Username>
<wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">bar</wsse:Password>
<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">foooooobar==</wsse:Nonce>
<wsu:Created>2010-01-25T13:09:24.860Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ns:fooBar>...</ns:fooBar>
</soapenv:Body>
Run Code Online (Sandbox Code Playgroud)
我已经下载并安装了Microsoft的WSE 3.0 SDK,并在我的Visual Studio 2005项目中添加了对DLL的引用.
我现在可以访问Microsoft.Web.Services3.*命名空间,但我目前难以理解如何继续.
客户端代码是由Web引用自动生成的,因此我只做了少量工作就将消息发送到未经身份验证的服务器:
WS.FooResultHttpService ws = new WS.FooResultHttpService();
ws.Url = "http://foo.bar.baz";
ws.SendSomething(message);
Run Code Online (Sandbox Code Playgroud)
我刚开始调查使用Microsoft.Web.Services3.Security.Tokens.UsernameTokenManager,但到目前为止,我还没有能够得到任何东西.
任何提示将不胜感激,因为我似乎无法在网上找到任何好的食谱.
谢谢!
是不是可以将Scheme中的函数视为任何其他列表?
基本上,我想要做的是这样的:
(define (foo) "hello")
(cdr foo) ; or similar, should return the list ((foo) "hello")
Run Code Online (Sandbox Code Playgroud)
我已经找到了类似的讨论,如果这不能用于Scheme,我会感到有点失望.如果是这样,为什么这是不可能的?在其他的lisps有可能吗?
编辑:改为(cdr'foo)为(cdr foo) - 这是误导.我问,为什么我不能作为列表访问函数?
使用时Reachability.h- Apple的代码处理iOS上的连接:
+ (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress;
Run Code Online (Sandbox Code Playgroud)
我收到以下警告:
Declaration of 'struct sockaddr_in' will not be visible outside of this function
Run Code Online (Sandbox Code Playgroud) 当从 Python 使用 libclang 时,它似乎不会自动搜索系统的包含路径。
有没有可靠的方法来获取这些路径?我不喜欢硬编码路径,因为我正在编写将在各种 UNIX 系统上运行的代码。
例如,给定 test.cpp
#include <stdio.h>
int main()
{
puts("Hello, world!");
}
Run Code Online (Sandbox Code Playgroud)
和测试.py
from clang.cindex import Index
tu = Index.create().parse(None, ["test.cpp"])
print(list(tu.diagnostics))
Run Code Online (Sandbox Code Playgroud)
运行python test.py将打印:
[<Diagnostic severity 4, location <SourceLocation file 'test.cpp', line 1,
column 10>, spelling "'stdio.h' file not found">]
Run Code Online (Sandbox Code Playgroud)
当然,我可以通过以下方式找到系统包含路径
$ clang -v -E test.cpp
Run Code Online (Sandbox Code Playgroud)
并添加"-Isome/path"到parse参数列表中,即
args = ["-I/Applications/[...]", "test.cpp"]
Run Code Online (Sandbox Code Playgroud)
这确实有效并且不会产生任何错误。
然而,这不是可移植的,如果我能够以编程方式让 clang 自动使用它们,那就太好了。
c++ ×3
algorithm ×2
lisp ×2
scheme ×2
boost ×1
c ×1
c# ×1
clang ×1
cmake ×1
iphone ×1
libclang ×1
obfuscation ×1
objective-c ×1
php ×1
python ×1
reflection ×1
security ×1
shared-ptr ×1
similarity ×1
trampolines ×1
web-services ×1
ws-security ×1
wse3.0 ×1