断言在Java中是否不安全?

断言在Java中是否不安全?,java,security,desktop-application,stack-trace,assert,Java,Security,Desktop Application,Stack Trace,Assert,在C#中,编译器可以通过从调试模式切换到发布模式来剥离断言。从安全性(和用户体验)的角度来看,这是一件好事,可以避免向最终用户公开stacktrace。此外,stacktrace可以提供一些信息,帮助黑客对软件进行反向工程 在查看Java断言之后,似乎不存在这样的功能。也就是说,断言保留在编译后的字节码中,Java编译器没有命令行选项将其删除。相反,我们看到的是,恶意用户可能会试图收集stacktrace信息。此外,我甚至看到一些人吐出了一个AssertionError和一个stacktrace

在C#中,编译器可以通过从调试模式切换到发布模式来剥离断言。从安全性(和用户体验)的角度来看,这是一件好事,可以避免向最终用户公开stacktrace。此外,stacktrace可以提供一些信息,帮助黑客对软件进行反向工程

在查看Java断言之后,似乎不存在这样的功能。也就是说,断言保留在编译后的字节码中,Java编译器没有命令行选项将其删除。相反,我们看到的是,恶意用户可能会试图收集stacktrace信息。此外,我甚至看到一些人吐出了一个
AssertionError
和一个stacktrace。或者简单地说,人们忽略了谈论让应用程序像这样失败的安全方面

我的初步评估是,Java中的断言构成了安全风险,即使它们为调试或维护提供了优势

我们是否应该避免在安全关键型应用程序中使用Java断言;或者,如果有一种适当且安全的方法包含断言,那么应该如何实现


为清晰起见进行编辑: 这里我假设Java应用程序作为桌面应用程序部署到最终用户。也就是说,用户下载/安装应用程序。话虽如此,我的理解是,用户能够运行一个可执行jar,同时启用具有以下效果的断言:

java -ea -jar "MyJar.jar"

断言不会使Java程序的安全性降低。这并不是说它是Java的一个“特性”,因为在您的计算机上运行的任何语言编写的任何程序都是不安全的,除非您可以利用TPM之类的东西(即使这样,它也不是完全安全的,除非您相信营销人员)

您没有义务向用户显示stacktrace,但这与安全性关系不大。将其写入日志要干净得多。您也没有义务使用断言,我认为与例如C#相比,它在Java生态系统中可能不太常见


stacktrace本身在桌面环境中提供的有用信息很少,因为您已经完全可以访问代码。有几十种收集信息的方法比用断言来耍花招更容易。首先,你可以反编译这些类。现在你可能会想“我会把它弄糊涂,至少会让它变得更难”,但这相当于说“我会建一个很低的栅栏,至少它会让婴儿远离”。这并不比什么都没有好,它什么都没有,但它会让你觉得你有某种程度的保护,这是一种安全风险

要么你有需要保护的信息,你必须使用有效的方法,要么你有不重要的信息,你不需要保护它。虽然安全端有不同的口味和要求,但天平是以这种方式二元的


在Web环境中,向用户显示STACKTrack可能是一个安全风险,因为它可以显示关于正在使用的库的信息,并通过库错误提供攻击向量。这就是为什么在生产中你看不到stacktraces,除非有人把事情搞砸了。

断言并没有使Java程序的安全性降低。这并不是说它是Java的一个“特性”,因为在您的计算机上运行的任何语言编写的任何程序都是不安全的,除非您可以利用TPM之类的东西(即使这样,它也不是完全安全的,除非您相信营销人员)

您没有义务向用户显示stacktrace,但这与安全性关系不大。将其写入日志要干净得多。您也没有义务使用断言,我认为与例如C#相比,它在Java生态系统中可能不太常见


stacktrace本身在桌面环境中提供的有用信息很少,因为您已经完全可以访问代码。有几十种收集信息的方法比用断言来耍花招更容易。首先,你可以反编译这些类。现在你可能会想“我会把它弄糊涂,至少会让它变得更难”,但这相当于说“我会建一个很低的栅栏,至少它会让婴儿远离”。这并不比什么都没有好,它什么都没有,但它会让你觉得你有某种程度的保护,这是一种安全风险

要么你有需要保护的信息,你必须使用有效的方法,要么你有不重要的信息,你不需要保护它。虽然安全端有不同的口味和要求,但天平是以这种方式二元的

在Web环境中,向用户显示STACKTrack可能是一个安全风险,因为它可以显示关于正在使用的库的信息,并通过库错误提供攻击向量。这就是为什么在生产中你看不到stacktraces,除非有人把事情搞砸了

相反,我们看到Java运行时允许启用断言,恶意用户可能会尝试收集stacktrace信息

如果用户能够在运行其安全性有问题的应用程序的JVM中启用断言,那么他们已经有了一定的访问级别,允许他们实现更严重的漏洞利用

确实,向最终用户公开堆栈跟踪可能会带来安全隐患,但堆栈跟踪是否以这种方式公开是应用程序设计者可以控制的

我们是否应该避免在安全关键型应用程序中使用Java断言;或者,如果有一种适当且安全的方法包含断言,那么应该如何实现

我认为有一个很好的理由可以避免对secur使用断言