java封装不加密但通过private字段和校验型getter/setter建立访问控制边界,配合序列化脱敏、https传输、aes加密及数据库哈希实现分层防护。

Java 中的封装本身不加密、不防传输窃听,但它通过控制访问边界,为敏感数据建立第一道“守门”机制——让非法读写在编译期或运行初期就被拦截,而不是等数据流出系统才补救。
私有字段是底线,不是终点
把密码、身份证号、余额等声明为 private,只是关上了门。真正起作用的是后续设计:
- 字段必须用 private 修饰,杜绝外部直接赋值(如
user.password = "123"在编译阶段就报错) - 构造器中就要校验初始值,避免对象一创建就带非法数据(例如
new User(null, -5)应直接抛异常) - 静态敏感字段(如密钥缓存)要用 private static final,配合专用 setter 控制更新逻辑
getter/setter 要当“守门人”,不能只做搬运工
public 方法是外界唯一合法入口,它得承担全部责任:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
setter 必须校验:比如
setPassword(String pwd)要判空、限制长度、拒绝明文存储(应哈希后存)、不记录原始值到日志 -
getter 要防御性返回:对
List、Map、数组等可变类型,不返回原始引用,改用Collections.unmodifiableList(roles)或new ArrayList(internalList) -
日期类注意拷贝:返回
LocalDateTime可直接返回(不可变),但Date要用new Date(d.getTime())防篡改
防住“看不见”的泄露点
很多敏感数据不是被黑客偷走的,而是被自己代码“主动交出去”的:
-
序列化时暴露:Jackson 默认会把 private 字段转成 JSON。敏感字段加
@JsonIgnore,或用@JsonView分离前后端视图 -
日志打印陷阱:重写
toString()时别拼密码;打日志前统一脱敏(手机号 →138****1234,身份证 →110101****1234****) -
异常信息泄露:不要在
Exception.getMessage()里拼用户输入或 SQL 片段;自定义异常只传错误码,具体原因记日志但不返给前端
封装和传输安全要分层协作
封装管好“数据怎么进、怎么出”,但不管“在路上安不安全”:
- 网络传输必须用 HTTPS(TLS 加密),不是靠 private 就能防中间人窃听
- 跨服务传递敏感对象时,建议先序列化为字节流,再用 AES 加密,接收方解密后再反序列化
- 数据库存储密码等字段,应设为
@Column(columnDefinition = "VARCHAR(255) BINARY")并配合应用层哈希,而非依赖 JPA 的自动映射
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










