我将 AES 解密密钥存储在 AndroidKeyStore 中以解密来自 SQLiteDB 的数据。不幸的是,有时我很少收到此错误(任何 android 设备和任何 API)。
我想知道这个错误到底是什么意思。
javax.crypto.BadPaddingException: error:1e000065:Cipher functions:OPENSSL_internal:BAD_DECRYPT.
我在哪里可以找到这些清单error:*?
我有一个用于受信任的应用程序代码的ClassLoader和一个用于用户提交的(不受信任的)代码的单独的ClassLoader。
我希望安全管理器限制用户提交的代码。如何从SecurityManager中检查呼叫者的来历?参见伪代码:
System.setSecurityManager(new SecurityManager() {
public void checkPermission(Permission permission) {
if (/*caller class is not loaded by the trusted classloader*/) {
throw new SecurityException("You do not have permissions.");
}
}
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试过的
StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE).getCallerClass().getClassLoader() 首先检查权限,以便给出堆栈溢出异常。
Thread.currentThread().getStackTrace()[2].getClassLoaderName() 这是不安全的,因为它仅提供类加载器名称,而不提供类对象,如果不可信加载器的规范名称与可信加载器相同,则存在安全问题。
我想通过 gradle 执行 JUnit 测试,我想避免在这些测试中调用 System.exit() 调用。我读过设置安全策略文件可以解决问题。
这是我正在使用的安全策略文件
grant {
permission java.io.RuntimePermission "exitVM", "none";
};
Run Code Online (Sandbox Code Playgroud)
我在 gradle 构建文件中设置 seecurity.policy 和安全管理器属性,如下所示:
systemProperty 'java.security.policy', file(project.ext.projectHome + "/security.policy").absolutePath
jvmArgs "-Djava.security.manager"
Run Code Online (Sandbox Code Playgroud)
但是当我运行测试时,测试任务失败并显示以下堆栈跟踪:
uccessfully started process 'Gradle Test Executor 20'
Exception in thread "main" java.lang.reflect.InvocationTargetException
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:513)
at java.instrument/sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:525)
Caused by: java.lang.ExceptionInInitializerError
at mockit.internal.state.TestRun.<init>(TestRun.java:43)
at mockit.internal.state.TestRun.<clinit>(TestRun.java:22)
at mockit.internal.faking.FakeMethods.registerFakeStates(FakeMethods.java:210)
at mockit.internal.faking.FakeClassSetup.registerFakeClassAndItsStates(FakeClassSetup.java:57)
at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:48)
at mockit.internal.faking.FakeClassSetup.<init>(FakeClassSetup.java:35)
at mockit.MockUp.redefineClass(MockUp.java:122)
at mockit.MockUp.<init>(MockUp.java:80)
at mockit.integration.junit4.FakeRunNotifier.<init>(FakeRunNotifier.java:24)
at mockit.internal.startup.JMockitInitialization.applyInternalStartupFakesAsNeeded(JMockitInitialization.java:37)
at mockit.internal.startup.JMockitInitialization.initialize(JMockitInitialization.java:26)
at mockit.internal.startup.Startup.applyStartupFakes(Startup.java:58) …Run Code Online (Sandbox Code Playgroud) 我尝试将安全属性附加到 java.security。因此,我添加了一个属性“java.security.properties”,指定要附加的文件。
我检查了 security.overridePropertiesFile 是否设置为 true。
由于某种原因,未应用对安全策略的更改。如果我直接更改文件“java.security”,一切都会正常。
找不到文件或文件内容不正确。我没有收到任何有关该位置的错误消息。我尝试了绝对路径、相对路径。该文件的内容如下(一行):
jdk.tls.disabledAlgorithms=ECDH, DH, RC4, DES, MD5withRSA, 3DES_EDE_CBC, DESede, DES, anon, NULL
我猜路径有问题,但不知道,因为没有关于它的日志。但无法找到有关路径的良好信息。所有示例都是相对路径,对我来说也不起作用。
我使用的是JDK11。
我正在使用 RMI 调用指定返回 class 对象的方法ClassX。
ClassX xObj = remoteObject.meth(...);
Run Code Online (Sandbox Code Playgroud)
SubclassOfX如果远程方法实际上返回 的本地未知子类的实例ClassX,则该类SubclassOfX会自动从 a 下载codebase(由 的序列化实例上的注释指定SubclassOfX)。
(对于那些需要它的人:RMI 中的代码库概念)
在 Java17 之前,必须使用 SecurityManager(和策略文件)来允许从代码库加载类。但从 Java17 开始,SecurityManager 已被弃用并标记为删除。
我现在的问题是:将来如何允许/控制从代码库加载类?
Edit1:只是为了回答引用 jep411 的评论:我知道这个文档,但其中没有针对 SecurityManager 的 RMI 用例给出解决方案/替代方案。
我正在将 jdk 8 升级到 11。
我在checkPermission方法中加载了一些类,然后安全管理器发出recursive update异常。但使用jdk1.8.0_202一切正常。
是什么导致了这个问题?
OS: macOS 10.15.6
JDK(Oracle): 11.0.8
IDE: Intellij 2019 3
Run Code Online (Sandbox Code Playgroud)
public class Main {
public static void main(String[] args) {
System.out.println("Hello world");
}
}
Run Code Online (Sandbox Code Playgroud)
package sm;
import java.security.Permission;
public class MySecurityManager extends SecurityManager {
@Override
public void checkPermission(Permission permission) {
// Problem occurs when load ServicePermission.class
if (permission instanceof javax.security.auth.kerberos.ServicePermission) {
// throw new SecurityException("javax.security.auth.kerberos.ServicePermission is not allowed.");
}
}
@Override
public void checkPermission(Permission …Run Code Online (Sandbox Code Playgroud) 我是一名大学讲师,我正在修改关于 Java 反射的讲座。其他几年,当我讲授抑制访问检查的可怕之处时,我向您展示了您可以设置一个 SecurityManager 并执行类似的操作
if ("suppressAccessChecks".equals(p.getName())){
StackTraceElement[] st = Thread.currentThread().getStackTrace();
if(.. st ..) { throw new SecurityException(); }
}
Run Code Online (Sandbox Code Playgroud)
通过这种方式,您可以允许列入白名单的反序列化器仅调用suppressAccessChecks。然而,现在他们正在弃用 SecurityManager。我认为新的模块系统应该在这里有所帮助,但我找不到解释如何支持上面白名单反序列化器的想法的资源。
有什么提示吗?