即使捕获到异常,应用程序也会崩溃(关闭)
Posted
技术标签:
【中文标题】即使捕获到异常,应用程序也会崩溃(关闭)【英文标题】:Application crashes (closes) even though exception is being caught 【发布时间】:2013-08-12 03:45:43 【问题描述】:我有以下代码:
public byte[] GenerateSignature(List<string> text_list)
StringBuilder text_string = new StringBuilder();
string private_key = "<RSAKeyValue><Modulus>zDYX4tbHSy....";
byte[] digital_signature = null;
for (int i = 0; i < text_list.Count; i++)
text_string.Append(text_list[i]);
try
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(private_key);
RSAPKCS1SignatureFormatter rsa_form = new RSAPKCS1SignatureFormatter(rsa);
rsa_form.SetHashAlgorithm("SHA1");
SHA1Managed sha1 = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text_string.ToString());
byte[] hash = sha1.ComputeHash(data);
digital_signature = rsa_form.CreateSignature(hash);
catch (Exception)
digital_signature = Encoding.Unicode.GetBytes("false");
return digital_signature;
现在,如果我更改私钥中的字符,应用程序会崩溃并在 rsa.FromXmlString(private_key)
行上关闭,即使代码包含在 try catch 块中。另一方面,如果我将私钥设置为无意义的值,例如blablabla
,则异常会被捕获并优雅地处理。
为什么当我从私钥更改单个字符时应用程序崩溃并关闭?例如,如果我将“<RSAKeyValue><Modulus>zDYX4tbHSy....
”更改为“<RSAKeyValue><Modulus>ADYX4tbHSy....
”,(将 z 更改为 A)应用程序崩溃并关闭。该应用程序是一个 Windows Phone 应用程序,但我想这应该没什么区别。
更新
这是抛出异常之前的调用堆栈:
MobileApp.dll!MobileApp.Classes.SignatureMobile.GenerateSignature(System.Collections.Generic.List text_list) 第 38 行 C# MobileApp.dll!MobileApp.StartPage.Button_LogIn_Click(object sender, System.Windows.RoutedEventArgs e) Line 74 + 0x4 bytes C# System.Windows.dll!System.Windows.Controls.Primitives.ButtonBase.OnClick() + 0x1f 字节 System.Windows.dll!System.Windows.Controls.Button.OnClick() + 0x1f 字节 System.Windows.dll!System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(System.Windows.Input.MouseButtonEventArgs e) + 0x4e 字节 System.Windows.dll!System.Windows.Controls.Control.OnMouseLeftButtonUp(System.Windows.Controls.Control ctrl, System.EventArgs e) + 0xc 字节 System.Windows.dll!MS.Internal.JoltHelper.FireEvent(System.IntPtr unmanagedObj, System.IntPtr unmanagedObjArgs, int argsTypeIndex, int actualArgsTypeIndex, string eventName) + 0x115 字节 [外部代码]
【问题讨论】:
大概你有一个崩溃的堆栈跟踪 - 它是什么? 异常类型是什么? @SriramSakthivel 我不知道。事实上,Visual Studio 不会报告异常。应用程序只是在模拟器中关闭,仅此而已。 相关性不大但很有用,注册到 AppDomain 上的 UnhandledException,这样如果从应用程序中抛出,您可以捕获异常。 你检查过text_list
是否为空吗?
【参考方案1】:
我认为您刚刚发现了一个错误。我假设键值被解析,然后传递给底层的本机库。该错误在底层库或围绕它的包装函数中没有得到妥善处理。请注意,当您将私钥从 z
更改为 A
时,您已经稍微更改了模数长度。模数大小现在与密钥大小不同。这可能没有经过很好的测试。
恭喜:)
【讨论】:
用公钥试试这个会很有趣。如果这也有效,您可能发现了一个可利用的错误。 请告诉我们您对此的看法,我会亲自为库生成错误报告。 我反过来模拟了这个错误,即使用公钥计算签名。如果我更改公钥中的字符,同样的错误仍然会出现。 我还没有检查异常是否在另一种应用程序中被捕获,例如控制台应用程序。因此,我不确定这个 bug 是否只出现在 Windows Phone 应用程序或其他类型的应用程序中。【参考方案2】:另一方面,如果我将私钥设置为无意义的值 例如 blablabla,异常会被优雅地捕获和处理。
这表明不同的文化背景
http://msdn.microsoft.com/en-US/library/system.globalization.cultureinfo.aspx
更新: RSA.FromXmlString 方法
FromXmlString 使用使用 ToXmlString 方法生成的 XML 字符串中的密钥信息初始化 RSA 对象。 FromXmlString 方法接受包含公钥的 XML 字符串或包含公钥和私钥的 XML 字符串。
此方法需要有效的 RSA 密钥。按规格有效:
https://www.rfc-editor.org/rfc/rfc3447#appendix-A.1.1
如果您按照描述使用私钥,难怪它会生成异常,因为私钥包含公钥和私钥。 另一方面,无意义的密钥可能仅被解释为公钥。
【讨论】:
谢谢 :) 我会调查此事 :) 谢谢 :) UnicodeEncoding 编码 = new UnicodeEncoding(); byte[] data = encoding.GetBytes(text_string.ToString());你确定编码后的字符串匹配模式吗? 是的,该字符串在调用后完美匹配,因为服务器对调用进行了身份验证。当私钥保持不变时,程序可以完美运行。当我更改程序崩溃的私钥中的单个字符时。但是,如果我将私钥设置为无意义的内容,例如“hellothere:)”,则会捕获并优雅地处理异常。我知道,这很奇怪。 你的意思是私钥吗?以上是关于即使捕获到异常,应用程序也会崩溃(关闭)的主要内容,如果未能解决你的问题,请参考以下文章
Apache Beam - 即使程序连续执行,也会捕获并抛出异常。如何停止该进程或在管道中处理
Flutter:在应用程序崩溃之前捕获ClientException(在收到完整标头之前连接关闭)