Java SecurityManager - 如何确保方法仅由另一个方法运行?

the*_*ous -3 java security

我希望B只能通过对敏感数据使用或执行某些处理的private方法运行A#getSensitiveData()(例如:加密密钥,国家ID,等等).

public final class A{
    private transient final B sensitiveHolder; //set at Constructor
    public A(B sensitiveHolder){
        this.sensitiveHolder = sensitiveHolder;
    }
    private final byte[] getSensitiveData(){
        return sensitiveHolder.getSensitiveData();
    }
}

public final class B{
    private transient final byte[] sensitiveData;//encrypt and set at Constructor
    public final byte[] getSensitiveData(){
        //check if it is run by A#getSensitiveData(); if it is, decrypt by DEK and give plaintext.
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意代码将被混淆,因此请不要将任何包名称放入String.

我必须写什么跟SecurityManager#checkPrivilege()AccessController.doPrivileged()我能达到这样的效果之前?

编辑:显然这是不同的,因为所谓的"答案"不包含任何代码.工作代码的价值远远超过"哦,只做这个和那个".

skw*_*skw 5

你可以这样做:

private boolean verify(final StackTraceElement e[]) {
    boolean doNext = false;
    for (final StackTraceElement s : e) {
        if (doNext && s.getClassName().equals("A") && s.getMethodName().equals("getSensitiveData"))
            return true;
        doNext = s.getMethodName().equals("getStackTrace");
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

并调用方法:

public final byte[] getSensitiveData(StackTraceElement e[]){
    if (verify(e)) {
        // Do something good
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的A课堂上,你的B课程如下:

return sensitiveHolder.getSensitiveData(Thread.currentThread().getStackTrace());
Run Code Online (Sandbox Code Playgroud)

我不知道这是不是你需要的,或者它就在附近.你可以玩一下这equals部分的值if.我从这个网站得到并修改了这个例子.