[英]Can I decrypt a password with c#, that was encrypted with PASSWORD_BCRYPT in php?
我不確定是否可以使用存儲在mysql數據庫中的c#解密密碼。 我使用PASSWORD_BCRYPT在php中加密了這些密碼。 如果可能的話我該怎么辦? 抱歉,我是初學者,在互聯網上找不到任何幫助。 這是我用來加密密碼的一段代碼。
$passwort = $con->real_escape_string($_POST['passwort']);
$hash = password_hash($passwort, PASSWORD_BCRYPT);
閱讀注釋后,我嘗試在C#中這樣做,但總是說出錯誤的密碼
string email = textBox1.Text;
string password = textBox2.Text;
string passwordHash = BCrypt.Net.BCrypt.HashPassword(password);
MessageBox.Show(passwordHash);
MySqlConnection conn = new MySqlConnection("datasource=127.0.0.1;port=3306;username=root;password=CIAO6CIAO6;database=kontoprogramm");
int i = 0;
conn.Open();
MySqlCommand cmd = new MySqlCommand("select KLPPassword from tklassenlehrpersonen where KLPEmail = '" + email + "' and KLPPassword = '" + passwordHash + "'", conn);
cmd.ExecuteNonQuery();
DataTable dt = new DataTable();
MySqlDataAdapter da = new MySqlDataAdapter(cmd);
da.Fill(dt);
i = Convert.ToInt32(dt.Rows.Count.ToString());
if (i == 0)
{
MessageBox.Show("Falsche Email oder Kennwort!");
}
else
{
MessageBox.Show("Angemeldet!");
}
有人能幫幫我嗎?
首先,只有在您嘗試進行故障排除和破解密碼解密(例如使用蠻力技術等)的情況下,您才能解密,因為最終通過password_hash函數從PHP生成的結果是生成哈希密碼,哈希結果。 通過哈希的基本概念,不可逆,但具有可比性。
您可以使用PHP函數password_verify比較密碼哈希(將數據庫中存儲的哈希與C#應用程序中輸入的密碼進行比較)。 如果您的要求確實是解密,則需要更改帖子的焦點,重新考慮疑難解答並破解密碼解密,例如,使用蠻力技術等。
現在,讓我們開始解決方案:您有兩種方法:
a)創建一個以“ Clear Text”作為輸入參數的PHP WebService,並以加密的文本密碼獲取輸出結果; Web服務的核心(在PHP中)使用帶PASSWORD_BCRYPT選項的password_hash進行加密。 之后,您的C#代碼使用加密的數據,並將此輸出哈希與數據庫中存儲的哈希進行比較; 但是,這種替代方法需要在WebServer和WebService層的安全性方面投入大量精力。 例如,您的C#代碼將以下PHP Web服務用作以下代碼:
WebClient webclient = new WebClient();
webclient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(webclient_DownloadStringCompleted);
webclient.DownloadStringAsync(new Uri("http://ws.phpurl.com/?password=stackoverflow@12345"));
void webclient_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
string phpWsEncryptedPass = e.Result;
string databaseEncryptedPass = //TO DO: query Database
//using WHERE statement,
//parsing 'phpWsEncryptedPass' as parameter;
}
b) 或者 ,下載您正在使用的Windows的相應PHP版本的二進制文件 ,使用DLL Reflector應用程序(例如dotPeek )了解這些DLL方法,並使用C#Interop功能導入DLL,並使用password_hash和password_verify來在您的C#代碼中使用它; 您需要努力打開DLL,以獲得正確的方法聲明。 注意:建議使用這種方法,因為用C / C ++編寫的PHP核心和C#代碼可能會消耗Windows二進制文件的PHP DLL,下面的代碼提供了一個示例:
[DllImport(@"C:\ProgramFiles\PHP\php_mbstring.dll", CharSet = CharSet.Unicode)]
internal static extern IntPtr password_hash(string clearTextpassword, int option)
[DllImport(@"C:\ProgramFiles\PHP\php_mbstring.dll", CharSet = CharSet.Unicode)]
internal static extern bool password_verify(string clearTextpassword, string hash)
就這樣。
由於鹽的原因,您無法在數據庫中搜索哈希,而只能按用戶名搜索並獲取存儲的哈希以進行驗證。 盡管原理是相同的,但該答案顯示了如何在PHP中進行操作。
並且在調用password_hash()
之前不要逃避用戶輸入,這會帶來麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.