Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止人们在编译的类文件中看到字符串文字?_Java_String_Jar_String Literals_.class File - Fatal编程技术网

Java 如何防止人们在编译的类文件中看到字符串文字?

Java 如何防止人们在编译的类文件中看到字符串文字?,java,string,jar,string-literals,.class-file,Java,String,Jar,String Literals,.class File,当你把一个.java文件编译成一个.class文件时,如果你有一行 String s = "This is a String" 如果在文本编辑器中打开.class文件,您将看到 This is a String 在文件的某个地方,在狼吞虎咽的粘液中 这对于大多数东西来说都很好,但在处理敏感信息(如API键)时就不行了 当然,一种替代方法是从另一个文件中读入API密钥,但这只会使查找密钥变得更容易,因为现在用户可以在打开.jar文件时打开“key.txt” 那么如何加密.class文件中的字符

当你把一个.java文件编译成一个.class文件时,如果你有一行

String s = "This is a String"
如果在文本编辑器中打开.class文件,您将看到

This is a String
在文件的某个地方,在狼吞虎咽的粘液中

这对于大多数东西来说都很好,但在处理敏感信息(如API键)时就不行了

当然,一种替代方法是从另一个文件中读入API密钥,但这只会使查找密钥变得更容易,因为现在用户可以在打开.jar文件时打开“key.txt”


那么如何加密.class文件中的字符串文字呢?

即使在类中对该信息进行加密,黑客也可以找到仅从代码中解密该信息的机制。因此,我认为最好将加密信息保存在其他文件中,然后读取该文件。另外,使用操作系统安全机制限制对该文件的访问。

如果将信息存储在类文件中,则解密密钥应来自类外部。您可以对数据进行加密,但如果您拥有类文件中的所有信息,则会丢失

您应该将API键存储在配置文件中。你有一个不同的API密钥用于开发和实时,对吗


另一种可能的解决方案是使用,它允许您以公开可访问的格式存储敏感信息。只有密钥持有者才能解密敏感数据。

当您向第三方发送代码时,您将失去对它的所有控制。即使您将API密钥作为加密字符串嵌入到何处,攻击者仍可能尝试并可能成功破解它,这将使您的所有加密/解密工作徒劳无功


在我看来,最好的解决方案是不在应用程序中提供任何敏感信息,而是为其提供某种ID。它需要的任何敏感值都将通过使用安全连接来提取。

如果您使用密钥访问第三方API,那么如果您将密钥与代码/应用程序一起交付,或者希望应用程序能够在没有中间人的情况下访问第三方API,则无法保护该密钥不受最终用户的影响

最终用户可以读取从应用程序发送到端点的所有数据,并知道API密钥。无论您采取何种措施对其进行加密,您都需要至少在解密后将其发送给第三方


安全的方法是要求用户登录到您提供的服务,向您的服务发送请求,然后您的服务(可能不在最终用户的机器上)向API发送带有密钥的请求。因此,最终用户永远不会知道密钥。

最方便的方法是从代码中删除任何敏感信息,并将其存储在某种类型的(可能加密的)存储库中。我也有同样的问题-当我反编译其他应用程序时(安卓apk)这是搜索的第一件事,实际上会导致对apk进行反向工程并理解反编译代码。Riot批准应用程序时,我会有一个发布密钥,目前我没有,但我当前的API密钥目前无法处理大规模使用不管怎样,当用户在他们的计算机上运行API密钥和加密密钥时,即使它们在jar中的不同文件中,它们最终都会在同一个.jar文件中。