如何在应用程序代码中安全地硬编码身份验证令牌 - Java

Posted

技术标签:

【中文标题】如何在应用程序代码中安全地硬编码身份验证令牌 - Java【英文标题】:How to safely hardcode an authentication token within an application code - Java 【发布时间】:2021-11-24 05:24:55 【问题描述】:

我知道将密码硬编码到程序中本质上是不安全的。大部分都可以通过IDA Pro等逆向工程工具破解。但是,如果除了这样做别无选择,是否有一种安全的方法可以做到这一点?

我需要向一小组用户发布一个小型 Java 客户端应用程序,并且需要对身份验证令牌进行硬编码。有什么建议吗?

谢谢

【问题讨论】:

没有办法。如您所述,如果令牌存储在代码中,则可以通过逆向工程提取。 【参考方案1】:

如果必须,Java 有一个 GuardedString 类,类似于 C# 中的 SecureString 类。

解决与将密码保存为 java.lang.String 相关的问题的安全字符串实现。也就是说,任何表示为 String 的内容都会作为明文密码保存在内存中,并且至少会保留在内存中,直到它被垃圾回收为止。

GuardedString 类通过将字符以加密形式存储在内存中来缓解这个问题。加密密钥将是一个随机生成的密钥。

在其序列化形式中,GuardedString 将使用已知的默认密钥进行加密。这是为了提供最低级别的保护,无论运输如何。对于与远程连接器框架的通信,建议部署启用 SSL 以实现真正的加密。

应用程序也可能希望保留 GuardedStrings。对于 Identity Manager,它应该将 GuardedStrings 转换为 EncryptedData,以便可以使用 Identity Manager 的管理加密功能对其进行存储和管理。其他应用程序可能希望将 APIConfiguration 作为一个整体进行序列化。这些应用程序负责加密 APIConfiguration blob 以增加一层安全性(超出 GuardedString 提供的基本默认密钥加密)。

【讨论】:

嗨,这可能对内存有用,但是如何安全地将令牌存储在代码本身中?有人可以对代码进行逆向工程并在其中搜索密码表单文本。 在用户机器上运行的应用程序中的任何密码最终都可以被逆向工程,无论你做什么——你只能让它变得更难而不是不可能。在用户可以访问的应用程序中存储任何内容从来都不是一种“安全”的方式。

以上是关于如何在应用程序代码中安全地硬编码身份验证令牌 - Java的主要内容,如果未能解决你的问题,请参考以下文章

如何在@Controller 中提取身份验证令牌

如何安全地实现“基于令牌的身份验证”以访问在 PHPFox 中开发的网站资源(即功能和数据)?

使用 HTTP 基本身份验证获取 JWT 令牌的安全性如何?

如何在 Angular 应用程序中存储身份验证令牌

Microsoft 帐户 JWT 身份验证令牌如何签名?

基于令牌的身份验证中的会话