我使用BCrypt Nuget包创建一个带有一些加密的Windows窗体应用程序。该程序包使用“Verify”方法检查密码和哈希值。如果密码和哈希匹配,则“Verify”方法返回true。我正在尝试通过在调用“Verify”方法时执行某些操作来向表单添加一些功能。
因此我将它用作任务,当我使用以“$ 2 $”开头的正确bcrypt哈希作为比较输入时,代码正常工作。但是当给出一个随机输入时,包识别出一个无效的盐,并且包被抛出了saltParseException,程序崩溃并显示异常未处理的错误。我尝试添加一个saltParaseException处理,但它仍然无法正常工作。
private void btncheckPassword_Click(object sender, EventArgs e)
{
bool isMatch = false;
if(txtPlainPasswordCheck.TextLength > 0 && txtHashedPasswordCheck.TextLength > 0)
{
try
{
var Task_VerifyPassword = Task.Factory.StartNew(() => BCrypt.Net.BCrypt.Verify((String)txtPlainPasswordCheck.Text, (String)txtHashedPasswordCheck.Text));
Task_VerifyPassword.ContinueWith(t => { throw new BCrypt.Net.SaltParseException(); }, TaskContinuationOptions.OnlyOnFaulted);
SetCursor(Cursors.WaitCursor);
isMatch = Task_VerifyPassword.Result;
}
catch (BCrypt.Net.SaltParseException e2)
{
SetCheckLabel(e2.Message.ToString(), Color.Red, Color.Black);
}
if (isMatch)
{
SetCheckLabel("Passwords Match", Color.Black, Color.Green);
SetCursor(Cursors.Default);
}
else
{
SetCheckLabel("Passwords Don't Match", Color.Red, Color.Black);
SetCursor(Cursors.Default);
}
}
}
答案 0 :(得分:2)
异常未处理,因为它被抛出在一个线程(运行ContinueWith
的线程池线程)中,但是你在另一个线程(GUI线程)上捕获它。
我强烈建议使用.NET 4.5(或带有Microsoft.Bcl.Async包的.NET 4)附带的async-await idiom的所有好处。有了它,处理从异步方法抛出的异常非常自然,并且继续(await
之后的代码)在捕获的SynchronisationContext上执行。你可以这样写:
private async void btncheckPassword_Click(object sender, EventArgs e)
{
if(txtPlainPasswordCheck.TextLength > 0 && txtHashedPasswordCheck.TextLength > 0)
{
bool isMatch = false;
SetCursor(Cursors.WaitCursor);
try
{
isMatch = await Task.Run(
() =>
{
try
{
return BCrypt.Net.BCrypt.Verify(
(String)txtPlainPasswordCheck.Text,
(String)txtHashedPasswordCheck.Text)
);
}
catch
{
throw new BCrypt.Net.SaltParseException();
}
}
);
if (isMatch)
{
SetCheckLabel("Passwords Match", Color.Black, Color.Green);
}
else
{
SetCheckLabel("Passwords Don't Match", Color.Red, Color.Black);
}
}
catch (BCrypt.Net.SaltParseException e2)
{
SetCheckLabel(e2.Message.ToString(), Color.Red, Color.Black);
}
SetCursor(Cursors.Default);
}
}
注意:我不熟悉BCrypt库,但从Verify
捕获任何异常然后抛出BCrypt.Net.SaltParseException
听起来不是一个好主意(你甚至说过这个例外是由'包'引发的,但你实际上是在自己抛出它)。允许传播任何异常会更好:
isMatch = await Task.Run(
() =>
{
return BCrypt.Net.BCrypt.Verify(
(String)txtPlainPasswordCheck.Text,
(String)txtHashedPasswordCheck.Text)
);
}
);