C# 使用sha256managed解密哈希
嗯,一周前我开始使用c#,我有点困惑 我从密码学开始,基本上是散列和盐 我的老师给了我们一些周末做的“家庭作业”,我和所有的同学都很困惑 我有一个简单的代码: 这个练习包括“解密”散列密码(使用SHA256managed散列),我们知道它是一个4个字符的数字 我试着用循环来解密所有字符,但是我被卡住了,我不知道如何继续 如果你能帮我一把,我会非常感激的 谢谢C# 使用sha256managed解密哈希,c#,encryption,hash,C#,Encryption,Hash,嗯,一周前我开始使用c#,我有点困惑 我从密码学开始,基本上是散列和盐 我的老师给了我们一些周末做的“家庭作业”,我和所有的同学都很困惑 我有一个简单的代码: 这个练习包括“解密”散列密码(使用SHA256managed散列),我们知道它是一个4个字符的数字 我试着用循环来解密所有字符,但是我被卡住了,我不知道如何继续 如果你能帮我一把,我会非常感激的 谢谢 using System; using System.Collections.Generic; using System.Linq; us
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography;
using System.IO;
namespace Examen
{
class Program
{
static void Main(string[] args)
{
string hashed_password = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";
Console.ReadLine();
}
}
}
我可能错了,但我确信解密散列字符串是不可能的。这就是为什么使用sha256或sha512在数据库中存储密码的原因 您需要做的是计算0000-9999之间所有值的散列,直到找到匹配的散列 下面是一个方法示例,该方法将在给定字符串的情况下为您计算哈希: 编辑:下面是一个简单的例子
using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
namespace TestConsoleProject
{
class Program
{
static void Main(string[] args)
{
string hashed_password = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";
int index;
for(index = 0; index <= 9999; index++)
{
if (hashed_password.Equals(sha256_hash(index.ToString("0000"))))
break;
}
Console.WriteLine("Password is: " + index.ToString("0000"));
Console.ReadLine();
}
public static String sha256_hash(String value)
{
using (SHA256 hash = SHA256Managed.Create())
{
return Convert.ToBase64String(hash.ComputeHash(Encoding.Unicode.GetBytes(value.ToCharArray())));
}
}
}
}
使用系统;
使用System.Collections.Generic;
使用系统文本;
使用System.Security.Cryptography;
命名空间TestConsoleProject
{
班级计划
{
静态void Main(字符串[]参数)
{
字符串哈希_password=“YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=”;
整数指数;
对于(index=0;index我的方法是使用蛮力,因为你说你已经知道这是一个4位数字了
您可以这样做:
static void Main(string[] args)
{
string hashed = "YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=";
for (int i = 1000; i <=9999; i++)
{
string digit = i.ToString().PadLeft(4, '0');
string s = ComputeSHA256(digit);
if (s == hashed)
{
Console.WriteLine(digit + "is my decrypted hash");
break;
}
}
Console.ReadKey();
}
static string ComputeSHA256(string plainText)
{
SHA256Managed sha256Managed = new SHA256Managed();
Encoding u16LE = Encoding.Unicode;
string hash = String.Empty;
byte[] hashed = sha256Managed.ComputeHash(u16LE.GetBytes(plainText), 0, u16LE.GetByteCount(plainText));
return Convert.ToBase64String(hashed);
}
static void Main(字符串[]args)
{
字符串hashed=“YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=”;
对于(int i=1000;i哈希是一个单向函数。给定密码“1805”,您将得到哈希值“2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs=”
您不能倒转:给定“2DOrd5wHHjYbtrSvQ+SyTH6HUDID5z+XV/cV8aYOSzs=”的散列,您无法计算“1805”的密码
但是,您可以尝试每个可能的密码,并查看每个密码的哈希值。然后,您有一个从“0000”到“9999”的所有可能密码的哈希值列表。在这种情况下,哈希值列表中的某个地方就是您感兴趣的:“YOSGtSkJ41KX7K80FEmg+vme4ioLsp3qr28XU8nDQ9c=”
您的程序应该用不到一秒钟的时间来发现密码
请注意,您的程序必须以UTF-16LE编码中与密码相同的格式散列数据,即8字节的数据。请确保您散列的数据格式与密码散列的数据格式相同,否则您将永远找不到匹配的数据。我有点困惑,您是说散列的密码也包含一个salt?您也是说t吗密码是4个数字,如0000到9999?你知道salt是什么吗?它也是4个数字吗?原始密码可以是0000到9999之间的值,散列密码不包含salt。对不起,我的英语不好,我是非英语国家的人。我必须在0000到9999之间找到这个值(非散列密码)这个例子是给出的实际值吗?我通过一个非常好的破解程序()运行了它它没有找到结果。搜索词-实际上有一种方法,因为老师在课堂上给我们看了结果。不可能解密它们,但你可以做字典或暴力攻击,通过SHA256运行猜测并比较两个结果。如果它们匹配,你基本上解密了。是的,我是说暴力攻击。是的我同意,一个简单的循环,从0000到9999,对循环的当前位置进行散列,然后比较结果,就可以解决它。我怎么做?我几天前刚从c#开始,用蛮力攻击有点难对付,但我不知道该怎么做我知道如何散列密码,但我不知道怎么做我可以使用蛮力攻击获取原始字符串的值吗?您的代码永远不会等于或找到字符串。hashed_密码
是base-64编码的,而不是十六进制。可能,但是Select
和string.Join
是不必要的。只需返回Convert.ToBase64String(hash.ComputeHash)的值即可(…)
。此外,您可以使用.ToString(“0000”)
,而不是使用“pad left”。这样可以减少创建额外字符串的需要。您的代码将永远不会等于或找到字符串。哈希密码是base-64编码的,而不是十六进制。此外,他不使用salt,因此必须删除。您还可能会丢失999个密码(0000至0999)。我错过了他关于不使用salt的评论。我是从1000开始这样做的,因为他明确地说这是一个4个字符的数字,但它也可以是前面加了0的前缀…..你对base64部分的看法也是正确的…..我在看了Jim下面的注释后也更正了编码部分…..现在给出了答案…..它是8765