簡體   English   中英

我可以用c#解密用php中的PASSWORD_BCRYPT加密的密碼嗎?

[英]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_hashpassword_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM