【问题标题】:C++: Reverse this hash?C++:反转这个哈希?
【发布时间】:2015-04-23 05:50:24
【问题描述】:

我一直在使用它来散列我的密码,但我觉得它不是很安全。我一直在谷歌搜索,看看是否有人使用它解密了一个字符串。这是加密算法,我不确定如何反转数学来解密哈希。欢迎任何帮助。这是 C++ 中的加密器。

编辑:我确实计划切换到更安全的哈希密码方法,但是为了做到这一点,我需要在转换为新的哈希 SHA256 字符串之前反转数学以将其转换为纯文本。这里的人似乎不理解我,我知道这是不安全的,这只是在 c++ 中展示算法。它实际上是针对不同的语言。我受限于我能做的事情以及我如何用那种语言做这件事。

#include <iostream>
#include <string.h>
using namespace std;



int main()
{
    char hasher[256];
    cout<< "Input a string!"<<endl;
    cin>> hasher;
    cout << endl;


for(int x=0; x < strlen(hasher); x++)
  {
      hasher[x] += (3^x) * (x % 15);
      if(hasher[x] > (255))
      {
          hasher[x] -= 256;
      }
  }

  cout << hasher << endl;
  system("pause");
  return 1;
}

【问题讨论】:

  • 它是一个加密字符串。对不起。
  • 您的char 类型是否超过8 位?否则,hasher[x] &gt; (255) 永远不会为真。
  • 我不确定。所有 char 类型都是 8 位正确的?
  • 顺便说一句,您的加密字符串中可能有 char 0(例如每 15 个字符),导致 cout 和其他函数只考虑其中的一部分。
  • 已删除安全代码。只需尝试单击答案下方的已编辑链接。 @amal

标签: c++ encryption hash


【解决方案1】:

您修改每个字符,only based on its relative position in the string。这是一种极弱的方法。它不会抗拒plain text attack(如果您知道两个密码及其编码):

password  ->  pcusôìÉÇ
abaaa     ->  adca}

所以攻击者会立即注意到第一个和第四个字符保持不变,而第二个和第三个字符移动了 2 个字母。平均 8 个字母的密码,有一半会被破解。不幸的是,许多密码可能会从前四个字母中猜出!

事实上,通过这种方式很容易找出其他班次 0,2,2,0,28, 30,30,28,88,80,90,....(不如您的公式令人印象深刻,不是吗?)。

您将您的用户真正置于危险之中。更好的是,转到标准哈希函数such as sha512 并仅将哈希存储在数据库中。这意味着无法找回密码(缺少信息)。但是您可以通过计算其输入的哈希值并将其与数据库中的哈希值进行比较来验证用户输入的密码是否正确(参见"article Safely storing user passwords")。

【讨论】:

  • 我确实计划切换到更安全的哈希密码方法,但是为了做到这一点,我需要在转换为新的哈希 SHA256 字符串之前反转数学以将其转换为纯文本。这里的人似乎不理解我,我知道这是不安全的,这只是在 c++ 中展示算法。它实际上是针对不同的语言。我的能力有限,以及我如何用那种语言做到这一点。
  • @ArtjomB。你是对的。要使用 0 和 ascii 密码,密码中的第 13 个字母需要“L”。我编辑了我的答案。
【解决方案2】:

您正在根据位置向角色添加一个数字。只需减去那个数字 3^x 等

【讨论】:

  • 谢谢。这真的很不安全。我认为这样做不会太难,但我不确定如何反转数学。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2012-03-20
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
相关资源
最近更新 更多