2015-10-07 99 views
0

我正在加载器/客户端上工作,我的论坛用户将使用他们的myBB信息登录到我的应用程序。我知道在应用程序中建立数据库连接并不好。但是我也将他们的hwid存储在数据库中,所以我需要连接到它。myBB密码c#客户端

然而,它们存储密码是这样的:

$hashedpsw = md5(md5($salt).md5($plainpassword)); 

而我试图重现口令是这样的:

string salt = "D4UFUd6U"; // get salt from db 
string password = "test!";// get password from user 
MD5 md5 = new MD5CryptoServiceProvider(); 

// Create md5 hash of salt 
byte[] saltBytes = Encoding.Default.GetBytes(salt); 
byte[] saltHashBytes = md5.ComputeHash(salt); 
string saltHash = System.BitConverter.ToString(saltHashBytes); 

// Create your md5(password + md5(salt)) hash 
byte[] passwordBytes = Encoding.Default.GetBytes(password + saltHash); 
byte[] passwordHashBytes = md5.ComputeHash(salt); 
string passwordHash = BitConverter.ToString(passwordHashBytes); 

,但我得到了以下错误:

cannot convert from 'string' to 'System.IO.Stream'

+0

您在哪一行发生错误? – Tobbe

+0

byte [] saltHashBytes = md5.ComputeHash(salt);''''byte [] passwordHashBytes = md5.ComputeHash(salt);' –

回答

2

ComputeHash想要一个IO.StreamByte[]作为输入,并且如错误指定的那样,不能从您的字符串隐式转换为IO.Stream

以下是(从this answer被盗)的你怎么能一个字符串转换成流的示例:

public Stream GenerateStreamFromString(string s) 
{ 
    MemoryStream stream = new MemoryStream(); 
    StreamWriter writer = new StreamWriter(stream); 
    writer.Write(s); 
    writer.Flush(); 
    stream.Position = 0; 
    return stream; 
} 

这将改变你的代码如下:

string salt = "D4UFUd6U"; // get salt from db 
string password = "test!";// get password from user 
MD5 md5 = new MD5CryptoServiceProvider(); 

// Create md5 hash of salt 
byte[] saltBytes = Encoding.Default.GetBytes(salt); 
byte[] saltHashBytes; 
using(Stream saltStream = GenerateStreamFromString(salt)) 
{ 
    salteHashBytes = md5.ComputeHash(saltStream); 
} 
string saltHash = System.BitConverter.ToString(saltHashBytes); 

// Create your md5(password + md5(salt)) hash 
byte[] passwordBytes = Encoding.Default.GetBytes(password + saltHash); 
byte[] passwordHashBytes; 
using(Stream saltStream = GenerateStreamFromString(salt)) 
{ 
    passwordHashBytes = md5.ComputeHash(saltStream); 
} 
string passwordHash = BitConverter.ToString(passwordHashBytes); 
+0

任何时候你使用流时,总是建议你用using语句包装它,这样即使抛出异常,它在完成时也会正确关闭。 byte [] saltHashBytes;使用(Stream saltStream = GenerateStreamFromString(salt)){saltHashBytes = md5.ComputeHash(saltStream); } –

+0

伟大的提示!随意编辑我的答案:) – Tobbe

+0

已编辑。虽然我没有在代码中检查* HashBytes数组变量在传递到BitConverter.ToString()方法之前是否为空。 –

1

您使用使用md5散列算法对MD5CryptoServiceProvider类进行加密。首先添加以下命名空间:

using System.Text; 
using System.Security.Cryptography; 

其次,尝试这样的功能。

public static string Encrypt(string content) 
{ 
    MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); 
    byte[] bytes = Encoding.ASCII.GetBytes(content); 
    bytes = md5.ComputeHash(data); 
    string result = Encoding.ASCII.GetString(bytes); 
    return result; 
}