出自《java puzzle》
私有成员,即私有方法、域和类型这些概念的幕后思想是它们只是实现细节:一个类的实现者可以随意地添加一个新的私有成员,或者修改和移除一个旧的私有成员,而不需要担心对该类的客户造成任何损害。换句话说,私有成员被包含它们的类完全封装了。
遗憾的是,在这种严密的盔甲保护中仍然存在细小的裂缝。例如,序列化就可以打破这种封装。如果使一个类成为可序列化的,并且接受缺省的序列化形式,那么该类的私有实例域将成为其导出API的一部分[EJ Item 54,55]。当客户正在使用现有的被序列化对象时,对私有表示的修改将会导致异常或者是错误的行为。
但是编译期的错误又会怎么样呢?你能否写出一个final的“库”类和“客户”类,这两者都可以毫无问题地通过编译,然后在库类中添加一个私有成员,使得库类仍然能够编译,而客户类却再也不能编译了?
如果你的解谜方案是要对库类添加一个私有构造器,以抑制通过缺省的公共构造器而创建实例的行为,那么你只是一知半解。本谜题要求你添加一个私有成员,严格地讲,构造器不是成员[JLS 6.4.3]。
本谜题有数个解谜方案,其中一个是使用遮蔽:
package library;
public final class Api {
// private static class String{ }
public static String newString() {
return new String();
}
}
package client;
import library.Api;
public class Client {
String s = Api.newString();
}
client/Client.java:4: incompatible types
found: library.Api.String, required: java.lang.String
String s = Api.newString();
^
尽管我们所做的文本修改仅仅是添加了一个私有类声明,但是我们间接地修改了一个现有公共方法的返回类型,而这是一个不兼容的API修改,因为我们修改了一个被导出API所使用的名字的含义。
这种解谜方案的数个变种也都可以实现这个目的。被遮蔽类型也可以来自一个外围类而不是来自java.lang;你可以遮蔽一个变量而不是一个类型,而被遮蔽变量可以来自一个static import声明或者是来自一个外围类。
不修改类库的某个被导出成员的类型也可以解决本谜题。下面就是这样的一个解谜方案,它使用的是隐藏而不是遮蔽:
package library;
class ApiBase {
public static final int ANSWER = 42;
}
public final class Api extends ApiBase() {
// private static final int ANSWER = 6 * 9;
}
package client;
import library.Api;
public class Client {
int answer = Api.ANSWER;
}
如上编写,该程序就可以毫无问题地通过编译。如果我们不注释掉library.Api中的私有声明,那么客户类将不能通过编译:
client/Client.java:4: ANSWER has private access in library.Api
int answer = Api.ANSWER;
^
这个新的私有域Api.ANSWER隐藏了公共域ApiBase.ANSWER,而这个域本来是应该被继承到Api中的。因为新的域被声明为是private的,所以它不能被Client访问。这种解谜方案的数个变种也都可以实现这个目的。你可以用隐藏一个实例域去替代隐藏一个静态域,或者用隐藏一个类型去替代隐藏一个域。
你还可以用遮掩来解决本谜题。所有的解谜方案都是通过重用某个名字来破坏客户类。重用名字是危险的;应该避免隐藏、遮蔽和遮掩。是不是对此已经耳熟能详了?很好!
分享到:
相关推荐
2023隐私计算峰会(公开)PPT汇总,共11份。 1、多方安全计算论坛 安全多方计算技术如何助力分布式数据安全聚合 高效的零知识证明:理论与实践 基于同态加密实现的隐匿查询方案 隐私计算中的多层次计算技术-以全...
第五节 你的隐私是怎么泄漏的(天融信网络安全公开课程)
Facebook宣布将对其隐私设置进行重大调整,使其更易于找到,并允许用户审查网站上所有公开的个人照片,这反映了公众对在线隐私控制日益增长的需求。 互联网上的大规模搜寻和追踪进一步加剧了隐私问题。人们越来越...
区块链系统的公开 透明特性使用户交易隐私受到严重威胁,针对此问题设计了不同应用场景相应的隐私问题解决方案。首先介绍区 块链技术且基本工作原理,并介绍区块链中典型的隐私问题,如交易隐私问题和账户隐私问题;...
个人隐私是指个人生活中不愿公开或不便公开的信息,这种隐私权受到法律的保护,任何组织或个人都不能侵犯。随着各国向大数据开放共享方向发展,隐私泄露、隐私破坏等问题越来越严重,尤其在中国,个人隐私保护面临...
据报告,大约一半的SNS用户愿意公开他们的私人信息,如身份认证、联系方式、工作和教育经历,甚至地理位置。这不仅增加了隐私泄露的风险,还引发了公众对网络安全的关注。 隐私悖论是指用户虽然关注隐私问题,但并...
- 对于必须使用真实姓名的订阅或注册,要注意这些网站是否可能会公开你的个人信息,如LinkedIn等。 - 反向操作策略,通过发布正面内容,如参与的公益活动或专业文章,来提升搜索结果的质量。 总的来说,保护个人...
例如,如果应用没有正确检查用户设置的隐私选项,或者在更新推文状态时未执行必要的权限验证,就可能导致私密推文被错误地公开。开发者需要在代码审查和测试阶段,对这些关键路径进行详尽的检查和测试。 其次,隐私...
文章中还提到了一些相关背景知识,比如互联网用户留下的大量事务信息,这些信息在被公司或机构收集后,需要进行适当的处理才能公开发布,否则会泄露用户的隐私信息。隐私保护数据发布研究的目标就是在不泄露用户隐私...
但其婚恋状况若无违法或道德问题,应当被视为个人隐私,未经同意的公开报道就构成了侵犯隐私权。 在日常生活中,我们需要培养保护隐私的意识,既要避免过度保护导致正常的社会交往受阻,也要学会在面对不合理侵犯时...
如果不加处理地公开,可能会导致用户隐私的侵犯。因此,隐私保护数据发布的目标是通过某种方式对原始数据进行匿名化或者脱敏处理,使得数据在保持一定的统计价值的同时,无法被用来识别特定个体。 书中详细介绍了...
总的来说,金山卫士隐私保护器的源代码公开,为IT专业人员提供了一个学习和研究隐私保护策略、安全编程、权限管理、加密技术和社区驱动开发的宝贵平台。无论是为了增强自身的安全意识,还是为了提升开发能力,深入...
原始数据在公开前需要通过一定的方法进行修改,以保证隐私信息不被泄露。常见的数据修改方法包括值替代法、聚集法、取样法和交换法。值替代法通过更改或替换数据属性值来隐藏隐私信息;聚集法将大量原始数据合并或...
课程要点: 1.隐私泄漏案例分析; 2.中间人是如何攻击截获隐私的(密码); 3.防止隐私泄漏的具体方法。
- **共享、转让和公开披露**:明确何时和如何与第三方共享信息,以及保障措施。 - **保护个人信息**:采取安全措施防止信息泄露,确保信息可控。 - **用户权利**:用户有权查看、更正、删除个人信息,以及拒绝或...
数据发布的隐私保护研究侧重于如何在公开数据集时,通过算法确保个体隐私不受侵犯,差分隐私模型就是其中的一种有效策略。 【结论】 云计算的快速发展带来了高效能计算和大规模存储的便利,但同时也伴随着数据安全...
k-匿名技术是其中一种广泛使用的隐私保护策略,它的目标是确保任何个人信息在公开发布时无法被唯一识别,以防止数据泄露导致个人隐私受到侵犯。本项目是用Python实现k-匿名隐私保护的一个实例。 k-匿名的基本思想是...
**cpp-Zbox:零公开重隐私的嵌入式文件系统详解** Zbox 是一款专为保护数据隐私设计的嵌入式文件系统,尤其适合于C/C++开发环境中的各种应用。其核心理念在于确保文件在存储和访问过程中的安全性,避免敏感信息的...