我希望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()我能达到这样的效果之前?
编辑:显然这是不同的,因为所谓的"答案"不包含任何代码.工作代码的价值远远超过"哦,只做这个和那个".
你可以这样做:
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.我从这个网站得到并修改了这个例子.
| 归档时间: |
|
| 查看次数: |
258 次 |
| 最近记录: |