我不确定是否可以使用存储在mysql数据库中的c#解密密码。我使用PASSWORD_BCRYPT在php中加密了这些密码。 如果可能的话我该怎么办?抱歉,我是初学者,在互联网上找不到任何帮助。这是我用来加密密码的代码。
$passwort = $con->real_escape_string($_POST['passwort']);
$hash = password_hash($passwort, PASSWORD_BCRYPT);
答案 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 features和password_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()
之前,请不要逃避用户输入,这会带来麻烦。