我可以用c#解密用php中的PASSWORD_BCRYPT加密的密码吗?

时间:2019-06-01 17:52:22

标签: c# php hash bcrypt

我不确定是否可以使用存储在mysql数据库中的c#解密密码。我使用PASSWORD_BCRYPT在php中加密了这些密码。 如果可能的话我该怎么办?抱歉,我是初学者,在互联网上找不到任何帮助。这是我用来加密密码的代码。

$passwort = $con->real_escape_string($_POST['passwort']);
$hash = password_hash($passwort, PASSWORD_BCRYPT);

2 个答案:

答案 0 :(得分:0)

首先,只有在您尝试进行故障排除和破解密码解密时,例如使用Brute Force技术等,您才能解密,因为最终PHP通过password_hash函数产生的结果是生成了哈希密码,即hash结果。按照哈希基本概念,不可逆,但具有可比性。

您可以使用PHP函数password_verify比较密码哈希(将数据库中存储的哈希与C#应用程序输入的密码进行比较)。如果您的要求确实是解密,则需要更改帖子的焦点,重新考虑疑难解答并破解密码解密,例如使用Brute Force技术等。

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

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) OR ,下载适用于Windows的各个PHP版本的binaries,使用DLL Reflector应用程序了解这些DLL方法(例如{{3} }),并使用dotPeek导入DLL,然后让C# Interop featurespassword_hash在您的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)

仅此而已。

答案 1 :(得分:0)

由于盐的原因,您无法在数据库中搜索哈希,而是只能按用户名搜索并获取存储的哈希以进行验证。 answer展示了如何在PHP中进行操作,尽管原理相同。

在致电password_hash()之前,请不要逃避用户输入,这会带来麻烦。