我正在制作一个密码类,同时自学java的安全api。这个类中会有一些敏感的东西,比如加密的类型等等。所有这些都可以反思性地找回——有人有动机。
我以前使用过反射来绕过私有变量和方法(并不为此感到自豪),所以我知道这是可以做到的。有没有一种方法可以完全防止反射在整个类上工作,甚至是在它的一部分上工作,或者这是否违背了java的设计,更具体地说是安全api的设计?
这被称为安全性-如果已知的加密算法的细节会使其不安全,那么它已经不安全了。
不,你无法阻止人们反思你的阶级。在最坏的情况下,他们可以加载一个JNI库,该库将直接进入JVM堆,并从那里读取(或写入)内存内容!如果你的代码在别人控制下的机器上运行,那么它所做的一切都不是真正的私有。
如果你自己写一个JNI库,它可以被反编译和反向工程(此外,根据许多司法管辖区过去的判例法,这是明确合法的)。
即使所有人都知道算法的工作原理,也要确保算法的安全,或者(更好的是!)使用已经编写好的Java语言实现。
如果您担心的是密钥材料的泄露,请使用Java方法访问密钥库。如果你真的很偏执,那么强制要求后台存储是PKCS11硬件令牌。
否-如果你对所涉及的安全管理器或代码的物理分发没有任何控制权,那么任何人都可以查看它。即使你可以确保你的应用程序正常运行,也可以使用配置为防止反射的安全管理器,如果攻击有你的代码(例如jar文件),那么他们可以随心所欲地运行它-或者反编译它,查看内容等。