我可以用c#解密一个密码吗?这个密码是用php中的password_BCRYPT加密的?

我可以用c#解密一个密码吗?这个密码是用php中的password_BCRYPT加密的?,c#,php,hash,bcrypt,C#,Php,Hash,Bcrypt,我不确定是否可以用存储在mysql数据库中的c#解密密码。我使用PASSWORD_BCRYPT在php中加密了这些密码。 如果可能的话,我该怎么做?对不起,我是个初学者,在网上找不到任何帮助。这是我用来加密密码的代码 $passwort = $con->real_escape_string($_POST['passwort']); $hash = password_hash($passwort, PASSWORD_BCRYPT); 读了这些评论后,我试着用c#写,但它总是说错误的密码 s

我不确定是否可以用存储在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!");
        }

有人能帮我吗?

首先,你不能解密,除非你努力排除故障并破解密码解密,例如,使用技术等,因为PHP by password\u散列函数的最终结果是生成一个散列密码,散列结果。根据散列的基本概念,它是不可逆的,但具有可比性

您可以使用PHP函数比较密码散列(将数据库中存储的散列与C#应用程序中输入的密码进行比较)。如果你的需求是真正的解密,那么你需要改变你文章的重点,重新考虑故障排除和破解密码解密,例如,使用技术等

现在,让我们来看解决方案:您有两种方法:

a) 创建一个以“明文”为输入参数参数化的PHP Web服务,并以加密文本密码的形式获取输出结果;Web服务的核心(在PHP中)使用password\u散列和password\u BCRYPT选项来加密。之后,您的C#代码将使用加密数据,并将此输出哈希与数据库中存储的哈希进行比较;然而,这种替代方案需要在Web服务器和Web服务层的安全性方面投入大量精力。例如,使用此PHP Web服务的C#代码如下所示:

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应用程序(例如)了解这些DLL方法,并用于导入DLL thta,并在您的C#代码中使用这些方法;您需要努力打开DLL,以获得正确的方法声明。注意:建议使用这种方法,因为用C/C++编写的PHP核心和C#代码可以使用PHP for Windows二进制文件的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)

仅此而已。

由于salt,您无法在数据库中搜索哈希值,而只能按用户名搜索,并将存储的哈希值用于验证。这说明了如何在PHP中实现,尽管原理是一样的


在调用
password\u hash()之前不要逃避用户输入。
这会带来麻烦。

您通常不会解密密码。如果你想知道密码是否正确,你应该加密你正在检查的密码,如果加密的密码与存储的加密密码匹配,那就好了。啊,谢谢。然后,是否可以用php的password_BCRYPT函数的相同哈希算法对c#中的密码进行加密,这样我就可以比较它们了?BCRYPT不是一种加密方法,而是一种,因此无法解密。对方法
real_escape_string
的调用不正确。如果您试图使用它来阻止SQL注入,那么您应该改用预处理语句。@Dharman Ok,谢谢。另外,如何将数据库中使用php中的BCRYPT函数创建的哈希字符串与用户在c#program中输入的密码进行比较?