String 在流中查找子字符串,而不在纯文本中存储子字符串

String 在流中查找子字符串,而不在纯文本中存储子字符串,string,algorithm,String,Algorithm,假设我有一个大的数据流(例如来自网络的数据包),我想确定这个数据是否包含某个子串。有多个,但它们需要算法知道它们正在搜索的纯文本字符串 比方说,正在搜索的字符串是密码,您不希望在此搜索应用程序中以纯文本形式存储它。但是,它将以纯文本的形式出现在流中。例如,您可以存储密码的哈希值和长度。然后,对于流中的每个字节,检查从流哈希到密码哈希的下一个长度字节数据是否可能匹配 这样,您就可以在不知道密码的情况下确定密码是否在流中。但是,对每个字节进行一次哈希运算并不快速/高效 也许有一种聪明的算法可以在流中

假设我有一个大的数据流(例如来自网络的数据包),我想确定这个数据是否包含某个子串。有多个,但它们需要算法知道它们正在搜索的纯文本字符串

比方说,正在搜索的字符串是密码,您不希望在此搜索应用程序中以纯文本形式存储它。但是,它将以纯文本的形式出现在流中。例如,您可以存储密码的哈希值和长度。然后,对于流中的每个字节,检查从流哈希到密码哈希的下一个长度字节数据是否可能匹配

这样,您就可以在不知道密码的情况下确定密码是否在流中。但是,对每个字节进行一次哈希运算并不快速/高效

也许有一种聪明的算法可以在流中找到纯文本密码,而不直接知道纯文本密码(以及一些不可逆的等价物)。或者,是否可以使用低质量的密码版本,从而存在误报风险?例如,如果搜索应用程序只知道一半密码(纯文本),它可能会在不知道的情况下检测到完整密码,但会出现一些错误

谢谢


p.S这个问题来自于我和一些朋友的一次假设性讨论,关于在网络上发现明文密码时提醒您。

您可以使用低熵来预筛选每个字节,这样,对于lg k位熵的成本,将加密散列的调用次数减少k倍。

是一个NP难问题。假设您的密码长度为n个字符。如果你能找到一个足够大的SAT实例

  • 使用数据流中m>=n字节的连续序列作为其8m输入位,以及
  • 当且仅当输入中的位包含从8位的某个倍数开始的密码时,生成输出1
然后,通过“操作”这个SAT实例作为一个电路,您将拥有一个密码检测器,它(至少可能)非常难以“反转”

在某些方面,你想要的恰恰相反。您需要计算真值表的最大、最毛茸茸的电路(对于一些理论上合理的大小和毛羽概念来说,这是理想的)。很容易找到保留真值表的方法来扩展原始的CNF命题逻辑公式——例如,如果你有两个子句A和B,然后你就可以安全地添加一个新的子句,它由a或B中的所有文字组成,但是要想找到一种方法来增加公式,使现代SAT解算器感到困惑,可能要困难得多,因为很多研究都致力于使这些程序在检测和利用问题中的各种结构方面非常高效


注入“复杂度”的一种可能途径是使电路计算难以计算的函数,如除法或平方根,然后测试这些函数的结果是否与原始输入相等。例如,与其让电路仅仅测试
X[1..8n]=您的密码
,不如让电路测试
X[1..8n]=您的密码和sqrt(X[1..8n])=sqrt(您的密码)
。如果SAT解算器足够聪明,能够“看到”第一个测试意味着第二个测试,那么它可以立即取消与第二个测试对应的所有子句——但由于所有内容都用命题子句表示在一个非常低的级别,这种关系(我希望;正如我所说,现代SAT解算器非常惊人)非常模糊。我的猜测是,最好选择不在整数上的sqrt()函数:这可能会导致SAT解算器浪费时间探索看似有希望(但最终不正确)的解决方案。

即使将密码哈希存储在内存中也可能不是一个好主意,因为攻击者可能会窃取哈希,然后对密码字典中的所有内容进行暴力哈希,并对照密码哈希检查哈希值。你能详细说明一下你的安全要求吗?您是否期望攻击者能够或不能执行某些特定的操作?不清楚您是在询问(a)要向发现您的源代码的人隐藏的已知密码,还是(b)与某些已知模式匹配的未知密码(如果模式也是未知的,那么就没有希望了,因为是什么阻止了任意字节序列成为密码?)。这些是完全不同的问题。前者可以通过充分混淆密码来“解决”(例如,通过使用多个哈希函数)。根据模式的类型,后者可以“解决”使用近似字符串匹配。@templatetypedef,因为这是假设性的,所以我没有严格的安全要求。@j_random_hacker选项a。我知道我的密码,但想隐藏它。谢谢,这是个好主意。所以将我的密码哈希为16位数字(希望比我的密码熵小),然后使用滚动哈希算法搜索此16位数字。一旦找到,请使用更密集的加密哈希进行检查。@bramp这就是想法,是的。