首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >C++中敏感字符串的模糊化技术

C++中敏感字符串的模糊化技术
EN

Stack Overflow用户
提问于 2009-10-30 00:31:17
回答 14查看 39.3K关注 0票数 102

我需要在我的C++应用程序中存储敏感信息(我想保持私有的对称加密密钥)。简单的方法是这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::string myKey = "mysupersupersecretpasswordthatyouwillneverguess";

但是,通过strings进程(或从二进制应用程序中提取字符串的任何其他程序)运行应用程序将显示上述字符串。

应该使用什么技术来掩盖这样的敏感数据?

编辑:

好吧,所以几乎所有的人都说过“你的可执行文件可以反向工程”--当然!这是我的宠物,所以我要在这里咆哮一下:

为什么99% (好吧,也许我夸大了一点)在这个网站上的所有与安全相关的问题的答案是“没有可能的方法来创建一个完全安全的程序”-这不是一个有用的答案!安全性是在完全可用性和无安全性之间的滑动尺度,而在另一端则是完全安全但没有可用性之间的滑动尺度。

关键是你选择你的位置在那个滑动尺度上取决于你想要做什么和你的软件将在什么环境中运行。我不是在为军事安装编写应用程序,而是在为家用PC编写应用程序。我需要使用预先知道的加密密钥,通过不可信的网络加密数据。在这种情况下,“通过默默无闻的安全性”可能已经足够了!当然,有足够的时间、精力和技能的人可以反向设计二进制文件并找到密码,但你猜怎么着?我不在乎:

实现一个一流的安全系统所需的时间要比由于破解版本而导致的销售损失更昂贵(并不是说我实际上是在卖这个,但你明白我的意思)。这种蓝蓝的“让它以绝对最好的方式去做”的趋势在新程序员中是愚蠢的。

谢谢你抽出时间回答这个问题--它们非常有用。不幸的是,我只能接受一个答案,但我对所有有用的答案都投了赞成票。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2009-10-30 00:37:04

基本上,任何能够访问您的程序和调试器的人都可以在应用程序中找到密钥,如果他们愿意的话。

但是,如果您只想确保在您的二进制文件上运行strings时键没有显示出来,那么您可以确保键不在可打印的范围内。

用异或隐藏密钥

例如,可以使用XOR将键拆分为两个字节数组:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
key = key1 XOR key2

如果创建key1的字节长度与key相同,则可以使用(完全)随机字节值,然后计算key2

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
key1[n] = crypto_grade_random_number(0..255)
key2[n] = key[n] XOR key1[n]

您可以在构建环境中这样做,然后只在应用程序中存储key1key2

保护二进制

另一种方法是使用工具来保护二进制文件。例如,有几个安全工具可以确保二进制文件被混淆,并启动运行它的虚拟机。这使得调试变得非常困难,而且也是许多商业级安全应用程序(唉,恶意软件)受到保护的通常方式。

西米达是最重要的工具之一,它在保护二进制文件方面做得很棒。它经常被众所周知的程序使用,如Spotify,以防止逆向工程。它有防止调试的功能,如OllyDbg和Ida。

还有一个更大的列表,也许有点过时,保护二进制文件的工具

其中一些是免费的。

密码匹配

这里有人讨论了哈希password+salt。

如果您需要将密钥与某种用户提交的密码相匹配,则应该使用单向散列函数,最好将用户名、密码和salt组合在一起。但是,这方面的问题是,您的应用程序必须知道salt才能进行单向操作并比较结果的散列。因此,您仍然需要在应用程序中的某个地方存储盐。但是,正如@Edward在下面的评论中所指出的,这将有效地防止字典攻击,例如使用彩虹表。

最后,您可以使用上述所有技术的组合。

票数 46
EN

Stack Overflow用户

发布于 2009-10-30 00:55:23

首先,要意识到你所能做的任何事情都无法阻止一个有足够决心的黑客,而且周围也有很多黑客。每一个游戏和控制台的保护最终都会被破解,所以这只是一个暂时的修复。

有4件事你可以做,这会增加你隐藏一段时间的机会。

1)以某种方式隐藏字符串的元素--类似xoring (^运算符)之类的明显内容--带有另一个字符串的字符串将足以使字符串无法搜索。

2)将字符串分成几个部分--将字符串拆分,并在奇怪的模块中弹出其中的一些奇怪的命名方法。不要让搜索和查找包含字符串的方法变得容易。当然,有些方法必须调用所有这些比特,但这仍然会使其变得更加困难。

3)永远不要在内存中构建字符串--大多数黑客使用的工具是,在您对字符串进行编码之后,可以让他们看到内存中的字符串。如果可能的话,避免这样做。例如,如果您要将键发送到服务器,则逐个字符发送该键,因此整个字符串永远不会出现。当然,如果您是从RSA编码之类的东西使用它,那么这就更棘手了。

4)做一个特别的算法--在所有这些基础上,增加一个或两个独特的转折。也许只要在你生产的东西上加1,或者做两次加密,或者加糖。这只会让那些已经知道当有人使用普通md5哈希或RSA加密时能找到什么的黑客变得更加困难。

最重要的是,当发现您的密钥时(如果您的应用程序变得足够受欢迎),确保它不太重要!

票数 9
EN

Stack Overflow用户

发布于 2020-05-02 08:15:22

有一个(非常轻的)只有头的项目模糊由阿达默克斯利制作,工作非常完美。它基于lambda函数和宏,在编译时使用XOR密码对字符串litteral进行加密。如果需要,我们可以更改每个字符串的种子。

下面的代码不会将字符串"hello world“存储在已编译的二进制文件中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include "obfuscate.h"

int main()
{
  std::cout << AY_OBFUSCATE("Hello World") << std::endl;
  return 0;
}

我已经用c++17和VisualStudio2019进行了测试,并通过IDA进行了检查,确认字符串是隐藏的。与ADVobfuscator相比,一个宝贵的优势是它可以转换为std::string (同时仍然隐藏在编译的二进制文件中):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::string var = AY_OBFUSCATE("string");
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1648618

复制
相关文章
Python中匹配模糊的字符串
如何使用thefuzz 库,它允许我们在python中进行模糊字符串匹配。此外,我们将学习如何使用process 模块,该模块允许我们在模糊字符串逻辑的帮助下有效地匹配或提取字符串。
Python学习者
2023/10/09
5640
Xen的敏感指令陷入-《Xen虚拟化技术》学习
没有虚拟化基础的童鞋可先阅读Linux阅码场前几天刊发的《KVM最初的2小时——KVM从入门到放弃(修订版) 》入门。
Linux阅码场
2019/10/08
1.6K0
Xen的敏感指令陷入-《Xen虚拟化技术》学习
C++中字符串的分割
下面开始正题,C++中字符串的分割。 1. 使用strtok函数进行字符串的分割 2. 使用stringstream类配合getline函数进行字符串的分割 3. 使用STL的find函数以及字符串类的substr函数进行字符串分割
卡尔曼和玻尔兹曼谁曼
2019/01/22
7.2K0
C++中字符串的分割
C++ OpenCV模糊图像
图像模糊是图像处理中最常用的也是比较简单的操作,使用该操作的原因之一就是为了给图像预处理时隆低嗓声.
Vaccae
2019/07/24
1.9K0
shell中字符串比较和模糊比较说明
    2、两边的双引号都是可有可无的,但当字符串为空的时候就会报错,提示unary operator expected,因此,需要加入双引号;
党志强
2020/01/30
14K0
C++ 中的原始字符串文字及C++ 中的字符串数组(1-2)
theme: channing-cyan highlight: a11y-dark
鲸落c
2022/11/14
1.8K0
C++字符串格式化
std::string & std_string_format(std::string & _str, const char * _Format, ...)
用户7886150
2021/02/19
8610
C++中对字符串的分割
由于C++中没有split函数,因此,为了能够对获取的字符串进行按一定符号进行分割,在此学习了通过字符串的find()方法和substr()方法来实现split();具体描述如下:  //涉及到string类的两个函数find和substr:  //  //1、find函数  //原型: size_t find(const string& str, size_t pos = 0) const;  //功能: 查找子字符串第一次出现的位置。  //参数说明:str为子字符串,pos为初始查找位置。  //返回值: 找到的话返回第一次出现的位置,否则返回string::npos  //2、substr函数  //原型: string substr(size_t pos = 0, size_t n = npos) const;  //功能: 获得子字符串。  //参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos)  //返回值: 子字符串
用户7886150
2021/01/16
2.3K0
模糊PID控制算法的C++实现
很久没有更新博客了,今天就来讲讲模糊PID的C++实现方法。先来看一下整体的框架:
全栈程序员站长
2022/08/18
2.8K0
模糊PID控制算法的C++实现
WEB中的敏感文件泄漏
文件泄露, 根据泄漏的信息敏感程度, 在WEB漏洞中可以算是中危甚至高危的漏洞, 本篇文章就来 介绍下一些常见的泄漏, 主要分为由版本管理软件导致的泄露, 文件包含导致的泄露和配置错误导致的泄露.
evilpan
2023/02/12
1.5K0
python实现字符串模糊匹配
之前笔者写过一篇文章关于如何做搜索,但那篇文章的角度是从文本相似度角度写的。那种方式是目前发展的趋势,但是真正的搜索特别是网页搜索不可能在大范围的文本之间两两算相似度的。那样搜索引擎的效率会变得特别低下。本文将从字符串模糊匹配的角度介绍一下搜索引擎。 一般的搜索,要分为两个步骤:搜索和排序。搜索的方法有很多,为了高效一般进行字符串或关键词匹配,而用户提供的一些关键词可能不是数据库中保存的,例如使用倒排的方法很难找到Head节点,此处需要使用模糊匹配的方式。这里简单列举一下Learning-to-Rank排序
CodeInHand
2018/04/08
22.9K0
python实现字符串模糊匹配
代码中的敏感信息加密方案
1. 代码中的敏感信息加密,例如邮箱账号密码、连接数据库的账号密码、第三方校验的key
37丫37
2019/01/03
1.3K0
sql模糊匹配中%、_的处理
防sql注入之模糊匹配中%、_处理:        StringBuilder sbSql = new StringBuilder(); sbSql.Append(@"SELECT * from tablename t where 1 = 1 "); string name = dictparameters["Name"].ToString(); //Name参数值 if(name.Contains("%"
guokun
2020/09/03
1.5K0
C语言和C++中的字符串(string)
C语言字符串是字符的数组。单字节字符串顺序存放各个字符串,并用'\0'来表示字符串结束。在C语言库函数中,有一系列针对字符串的处理函数,比如说strcpy()、sprintf()、stoi()等,只能用于单字节字符串,当然也有一些函数用于处理Unicode字符串,比如wcscpy()、swprintf()等
用户7886150
2021/02/16
3K0
C++ 取出字符串中的所有整数
将其中连续的数字作为一个整数,依次存放到一个数组a中。统计总共有多少个整数,并输出这些数。
雪碧君
2023/02/15
1.4K0
替换文件中的敏感信息
Long long time no see.『每日一坑』栏目又来啦! 今天我们来做一个现实中有可能会碰到的问题: 替换文件中的敏感信息 问题描述 假设我们有一份文件,文件中包含了很多个人信息。现在需要一份去除其中敏感信息的版本,将文件中所有手机号的4~7位和身份证号的6~15位用 * 替换。 (注意:有的身份证号是以X结尾) 示例 输入文件 张三 居住地:南京 身份证号:320101199909091234 手机号:13013013130 李四 居住地:上海 身份证号:31010120000101234X
Crossin先生
2018/04/17
1.9K0
MySQL中的大小写敏感
今天同事问了一个问题,是关于MySQL大小写敏感的。 如果根据关键字case来搜索,会发现有两个参数。 mysql> show variables like '%case%'; +------------------------+-------+ | Variable_name | Value | +------------------------+-------+ | lower_case_file_system | OFF | | lower_case_table_names |
jeanron100
2018/03/21
2.6K0
URL中的大小写敏感
URL中的大小写敏感 http://fred:wilma@www.example.com/private.asp?doc=3&part=4#footer 协议标示符 (http/https) 大小写不
tea9
2022/09/08
1.4K0
点击加载更多

相似问题

matlab图像模糊化技术研究

12

C++模板模糊实例化

11

C++临时类的模糊实例化

22

盖茨比注释图像模糊技术

14

如何在模糊剪辑中模糊化?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文