Tag: java

Java安全性:如何清除/清零与对象关联的内存? (和/或确保这是唯一的实例/特定variables的副本)

我正在讨论如何保护存储在Java程序中的敏感信息(例如密码)。 根据安全要求,将清除包含敏感信息的内存,例如将字节值设置为全零。 担心的是攻击者可以观察与应用程序进程相关的内存,所以我们要尽可能地限制这种敏感信息的时间窗口。 以前,项目涉及C ++,因此memset()已经足够了。 (顺便说一句,memset()的使用已经成为问题,因为已知某些编译器会根据假设来优化它的使用,因为以后不会使用内存,所以不需要将其归零第一个地方,这个blurb对于那些Google为“memset”和“清除内存”的人来说是一个免责声明)。 现在,我们已经掌握了一个Java项目,正在按这个要求。 对于Java对象,我的理解是: 一个空引用只改变引用的值; 对象的堆上的内存仍然包含数据 一个像String这样的不可变对象将无法修改数据(或者至less不是很容易的,在具有相应的安全pipe理器的虚拟机的范围内) 代代垃圾收集者可以在整个地方复制物体(如这里所述 ) 而对于原始的,我的理解是: 本地方法中的原始typesvariables将被分配到堆栈上,并且: 当你改变它的值的时候,你直接在内存中修改它(而不是使用引用来处理堆上的对象)。 在某些情况下,副本可以/在“幕后”进行,例如将其作为parameter passing给方法或装箱(自动或不是)创build包含另一个具有相同值的原始variables的包装的实例。 我的同事声称,Java原语是不可改变的,NSA和Oracle都有文档说明在这种需求方面缺乏对Java的支持。 我的立场是,基元可以(至less在某些情况下)通过将值设置为零(或布尔值为false)来清零,并且内存以这种方式被清除。 我试图validationJLS或其他“官方”文档中是否存在关于JVM在涉及基元的内存pipe理时所需行为的语言。 我能find的最接近的是Oracle网站上的“Java编程语言安全编码指南” ,其中提到了在使用后清除字符数组。 当我的同事把原始的东西称为不可改变的时候,我会质疑定义,但我很确定他的意思是“记忆不能适当地调零” – 我们不用担心。 我们没有讨论他是否意味着最后的变数 – 从我们一般说的上下文来看。 有没有什么明确的答案或参考? 我会很感激任何可以告诉我我错在哪里或确认我是对的。 编辑 :经过进一步的讨论,我已经能够澄清,我的同事想到的是原始包装,而不是原始本身。 所以我们留下的是如何安全地清理内存,最好是对象的原始问题。 另外,为了说明,敏感信息不仅仅是密码,还包括IP地址或encryption密钥等。 有没有商业JVM提供像某些对象的优先处理function? (我想这实际上违反了Java规范,但我想我会问,以防万一我错了。)

为什么Gradle需要一个settings.gradle文件?

我要将我的Android项目从Ant转换为Gradle。 我的Eclipse工作区非常简单: Workspace MyApp MyApp-AndroidLibrary 当我在MyApp中添加build.gradle文件时,我想引用我的Android库项目: apply plugin: 'android' dependencies { compile fileTree(dir: 'libs', include: '*.jar') compile project(':MyApp-AndroidLibrary') } 当我运行gradle构build时,出现了一个错误“Project with path”:MyApp-AndroidLibrary'在根项目中找不到',我为此search了一下,发现我需要在我的工作区中设置一个“settings.gradle”文件目录,添加 include ":MyApp" include ":MyApp-AndroidLibrary" 这看起来对我来说太糟糕了,为什么Gradle需要一个settings.gradle文件 ,为什么不提取我在依赖关系中定义的项目呢? 什么include真正的手段? 如果我在工作区中安装了附加应用程序和其他共享库,结构可能如下所示: Workspace App1 App2 Library1(Used by App1 & App2) Library2(Used only by App1) Library3(Used only by App2) 因为只有一个settings.gradle文件,我不得不将它们全部添加到settings.gradle中。 那味道不好。 是的,我可以重新组织结构,使Library2成为App1的子目录,而Library3成为App2的子目录,但是Library1呢? 对此有何评论?

有一个更现代的OO版本的“让我们build立一个编译器”?

有没有更现代的,也许是面向对象的,相当于Jack Crenshaw的“ Let's Build a Compiler ”系列? 前段时间,我偶然发现了“ 让我们编译一个编译器 ”,并不能拒绝写一些代码。 我在C#中编写了一个输出.NET CIL的recursion下降C编译器。 “写一次,到处漏”是我的口号。 太糟糕了,我一直没有意识到parsingC是一个噩梦。 我现在感兴趣的是用Java编写Java编译器,输出.NET CIL或程序集,目标是自引导。 我希望有一些更新的教程可以踢。 顺便说一句,你会花更多的时间进行前期devise,还是只是写一大堆testing来支持无情重构的能力。 回想起来,我倾向于后者。 编译器工作,但代码真的很糟糕。

在Windows 7上启动Java应用程序的最佳方法是什么?

要求 我想在Windows 7上发布Java GUI应用程序。此应用程序使用Swing Toolkit,不需要任何本机代码。 该应用程序使用NSIS安装程序进行安装。 我想尽可能将这个应用程序集成到Windows 7中。 意即: 应用程序运行时,必须可以将应用程序固定到任务栏。 必须能够将数据文件与应用程序相关联,以便Windows使用我的应用程序打开这些文件。 必须自动使用32位Java运行时和64位Java运行时。 所以,当用户卸载一个32位的Java,并安装一个64位的Java(反之亦然),那么我的应用程序必须仍然工作。 必须支持Windows的大字体设置。 我不太了解这个function。 我只是知道一些应用程序完全忽略它,其他人(像谷歌浏览器)是像素缩放(看起来很丑),而其他人通过简单地使用更大的字体支持它(这是我想要的,通常它的工作原理只有WinRun4J解决scheme以下提到不起作用)。 testing的解决scheme WinRun4J WinRun4j是启动Java应用程序的EXE文件。 因为应用程序不分叉新的Java进程Windows认为EXE文件是应用程序。 所以任务栏没有问题。 文件关联工作,因为文件可以简单地与EXE文件相关联。 问题: 不支持大字体。 应用程序窗口像素缩放,而不是像谷歌浏览器。 根据安装的JRE,必须使用两个不同的EXE文件。 所以当安装64位JRE时,应用程序必须以64位EXE文件启动。 安装32位JRE时,必须使用其他EXE。 这不是用户友好的,因为用户不明白为什么只安装32位JRE时,他必须使用64位操作系统上的32位EXE。 Launch4J Launch4J创build一个32位EXE,启动一个外部Java进程来启动Java应用程序。 所以不像WinRun4J,它也可以启动一个64位的Java。 问题: 无法将应用程序固定到任务栏。 如果headerType="gui" , System.out.println将不会打印到控制台,无论应用程序是否从控制台启动。 jar 在Windows上,您只需双击JAR文件即可启动应用程序。 安装的JRE无所谓,简单的工作。 但… 问题: 应用程序不能被固定到任务栏。 无法在开始菜单中创build快捷方式。 无法将文件与JAR文件相关联。 BAT / CMD 像这样一个简单的batch file可以用来启动应用程序: @echo off start c:\windows\system32\javaw.exe -jar […]

使用Android Studio 2.0启动Android应用程序时安装重新启动补丁程序时出错

目前我正在使用Android Studio 2.0并将我的APK安装到我的三星设备(S6)中。 但是,重build我的代码并再次运行时收到以下错误: Error installing cold swap patches: com.android.tools.fd.client.InstantRunPushFailedException: Error creating folder with: run-as com.appcustomer mkdir -p /data/data/com.appcustomer/files/instant-run/inbox Error while Installing restart patches 有谁知道这个问题是什么?

Java:通用方法重载模糊

考虑下面的代码: public class Converter { public <K> MyContainer<K> pack(K key, String[] values) { return new MyContainer<>(key); } public MyContainer<IntWrapper> pack(int key, String[] values) { return new MyContainer<>(new IntWrapper(key)); } public static final class MyContainer<T> { public MyContainer(T object) { } } public static final class IntWrapper { public IntWrapper(int i) { } } public static […]

generics方法实现中不同的返回值types

今天,我偶然发现了一些我不希望编译的Java代码。 减less到最低限度,看起来像这样: import java.util.List; interface A { <T> List<String> foo(); } interface B { <T> List<Integer> foo(); } class C implements A, B { @Override public List<?> foo() { return null; } } 乍一看, A和B foo方法的types参数<T>看起来没有必要,因为在其他地方没有使用T 无论如何,我发现这在允许相互冲突的返回值types在同一个实现中共存的过程中发挥了至关重要的作用:如果一个或两个<T>被遗漏,代码不会被编译。 这里的非工作版本: import java.util.List; interface A { List<String> foo(); } interface B { List<Integer> foo(); } class C implements […]

JPA:何时select多值关联与元素集合映射

我想更好地理解之间的差异 (1)传统的多值关系/关联 @Entity -> @OneToMany -> @Entity 和 (2) embedded式(和基本)types的JPA2 集合 @Entity -> @ElementCollection -> @Embeddable 我看到了语法上的差异,但不知道是否也有性能影响 。 在引擎盖下,数据库实现看起来非常相似。 直觉上,我通常使用@ElementCollection 组合场景 。 但即使如此,感觉非常类似CascadeType=DELETE 。 我在这里错过了本质吗? 为了某些目的,一个比另一个更有效率吗? 谢谢J.

在java中的try-catch块之后使用“finally”有什么好处?

当try-catch结束时,总是执行“finally”块,以防exception。 但是try-catch之外和之后的每一行代码都会被执行。 那么,我为什么要使用最后的陈述呢? 例: try { //code… } catch (Exception e) { //code… } finally { System.out.println("This line is always printed"); } System.out.println("Also this line is always printed !! So why to use 'finally'?? ");

使用java.util.concurrent.locks.ReadWriteLock进行@GuardedBy批注

什么是用ReadWriteLock保护字段的正确/首选方式,以便像FindBugs这样的工具可以利用注释? ReadWriteLock的名字应该只写在@GuardedBy注释中。 是否有理由在@GuardedBy注释中只写入读锁的名称,或只是写锁? FindBugs或其他工具是否支持@GuardedBy ReadWriteLock ?