java - 在 Java 中确定当前用户的受支持的、不可欺骗的方法?

标签 java authentication

由于各种原因,我有一个 Java 应用程序需要能够检测哪个用户正在运行它。我看到了一些解决该问题的建议,但没有一个是完全令人满意的。

有些人建议使用系统属性 user.name,但这并不可靠,因为它至少可以通过两种方式进行欺骗(更改系统查找的环境变量的值,或者通过 -Duser.name 选项以覆盖值启动程序。

另一种选择是使用 com.sun.security.auth.module 包中的类,但是 Java Ruling Class 非常清楚为什么这不是一个好主意(参见示例this web page ).

这似乎是一个非常有值(value)的功能,应该有一种方法可以在受支持的 Java 中执行此操作,但我还没有找到它。有什么建议吗?

最佳答案

For various reasons, I have a Java application that needs to be able to detect which user is running it.

不幸的是,在现代,尤其是在 unix/posix 系统上,由用户定义在加载 java 时加载哪些库。这可以包括一个库,该库拦截对检查用户名的 C 运行时 (libc) 的调用。

更不用说用户命名空间是多个操作系统上的常见功能,它允许任何非特权用户设置任意用户名。 这是设计使然。

简而言之:系统是用户的。您不能使用该系统所说的任何内容来针对任何其他系统进行身份验证。这是与身份验证系统一样古老的真理:您需要一个信任 anchor ,而在您无法控制的系统上,这样的 anchor 不是您能得到的——除非您拥有 TPM 或 FIDO/加密智能卡读卡器之类的东西。

您将不得不找到一种根本不同的安全机制。如果您有任何事情要对用户隐瞒,您将永远无法信任用户的系统。想一想:您的用户很可能会启动一个他们控制一切的虚拟机;他们非常逐字节地复制原始机器的硬盘驱动器,但是他们将该虚拟机中的用户名更改为其他人的用户名。您的系统游戏结束。

我觉得我需要重复一遍:您不能信任用户的系统。如果您的安全取决于您的软件实际执行预期的操作(例如验证密码,或检查任何其他内容) ,如果成功,则在某处发送数据包),然后一个简单的调试器可以跳过任何安全措施并执行您在未验证的情况下不打算执行的代码。作为开发人员,您知道如何使用调试器。任何用户也可以使用调试器。

关于java - 在 Java 中确定当前用户的受支持的、不可欺骗的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69291580/

相关文章:

authentication - Apache Shiro - 使用 cn 以外的属性进行身份验证?

wpf - ADFS vNext 客户端身份验证 (WPF) (Windows Server 2016 Preview 3)

java - 检查用户是否首次使用 Firebase Auth 和数据库登录 Android 应用程序

python - Pyramid 应用程序中的基本/摘要 HTTP 身份验证

java - quartz : triggering multiple jobs

authentication - 使用 ember Octane 登录后刷新应用程序路由模型

java - 将 SQL 与 JAVA 代码分离

java - 从 Google App Engine 请求 header 获取时区偏移量?

java - 无法在 @Test Junit Selenium Web 驱动程序中使用定位器

java - 在 java 中比较两个 ArrayLists 时出错