如何掌握 Java 中的安全机制,如权限控制和加密解密

Java是一门具有强大安全功能的编程语言,它内置了多种安全机制,包括权限控制、加密解密、认证授权等。

一、权限控制

权限控制是Java安全模型的重要组成部分,它主要通过Java安全管理器(Security Manager)和权限(Permissions)来实现。

1、Java安全管理器(Security Manager)

Java安全管理器是一个能够控制应用程序行为的组件。它通过检查代码是否具有执行特定操作的权限来保护系统资源。要启用安全管理器,可以在运行Java程序时使用-Djava.security.manager参数。例如:

java -Djava.security.manager YourApplication

在代码中,也可以通过以下方式启用安全管理器:

System.setSecurityManager(new SecurityManager());

2、权限(Permissions)

Java权限系统由权限类(java.security.Permission)和策略文件(Policy File)组成。权限类代表对系统资源的访问控制,例如文件读写权限、网络访问权限等。

以下是一些常见的权限类:

  • FilePermission:控制对文件和目录的访问权限。
  • SocketPermission:控制对网络资源的访问权限。
  • RuntimePermission:控制运行时的权限,例如创建类加载器、访问系统属性等。

3、策略文件(Policy File)

策略文件用于定义哪些代码源可以被授予哪些权限。默认的策略文件位于$JAVA_HOME/lib/security/java.policy。我们也可以创建自定义的策略文件,并在启动应用程序时指定:

java -Djava.security.manager -Djava.security.policy=custom.policy YourApplication

一个简单的策略文件示例如下:

grant {permission java.io.FilePermission "/path/to/file", "read,write";permission java.net.SocketPermission "localhost:8080", "connect,accept";
};

在这个示例中,任何代码都被授予对指定文件的读写权限和对本地端口8080的网络访问权限。

二、加密和解密

加密和解密是保护数据安全的重要技术,Java提供了广泛的加密和解密API,主要集中在javax.cryptojava.security包中。

1、对称加密

对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法有AES、DES等。以下是一个使用AES加密和解密的示例:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class SymmetricEncryptionExample {public static void main(String[] args) throws Exception {// 生成密钥KeyGenerator keyGen = KeyGenerator.getInstance("AES");keyGen.init(128);SecretKey secretKey = keyGen.generateKey();byte[] keyBytes = secretKey.getEncoded();// 加密Cipher cipher = Cipher.getInstance("AES");cipher.init(Cipher.ENCRYPT_MODE, secretKey);String plainText = "Hello, World!";byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted Text: " + encryptedText);// 解密SecretKey originalKey = new SecretKeySpec(keyBytes, "AES");cipher.init(Cipher.DECRYPT_MODE, originalKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));String decryptedText = new String(decryptedBytes);System.out.println("Decrypted Text: " + decryptedText);}
}

2、非对称加密

非对称加密使用一对密钥(公钥和私钥),公钥用于加密,私钥用于解密。常见的非对称加密算法有RSA、DSA等。以下是一个使用RSA加密和解密的示例:

import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
import java.util.Base64;public class AsymmetricEncryptionExample {public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");keyGen.initialize(2048);KeyPair keyPair = keyGen.generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 加密Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, publicKey);String plainText = "Hello, World!";byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());String encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);System.out.println("Encrypted Text: " + encryptedText);// 解密cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText));String decryptedText = new String(decryptedBytes);System.out.println("Decrypted Text: " + decryptedText);}
}

3、数字签名

数字签名用于验证数据的完整性和来源,通常使用非对称加密算法。以下是一个生成和验证数字签名的示例:

import java.security.*;
import java.util.Base64;public class DigitalSignatureExample {public static void main(String[] args) throws Exception {// 生成密钥对KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");keyGen.initialize(2048);KeyPair keyPair = keyGen.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();// 签名Signature signature = Signature.getInstance("SHA256withDSA");signature.initSign(privateKey);String data = "Hello, World!";signature.update(data.getBytes());byte[] digitalSignature = signature.sign();String signatureString = Base64.getEncoder().encodeToString(digitalSignature);System.out.println("Digital Signature: " + signatureString);// 验证签名Signature signatureVerify = Signature.getInstance("SHA256withDSA");signatureVerify.initVerify(publicKey);signatureVerify.update(data.getBytes());boolean isVerified = signatureVerify.verify(Base64.getDecoder().decode(signatureString));System.out.println("Signature Verified: " + isVerified);}
}

4、消息摘要

消息摘要算法用于生成数据的唯一摘要,常见的算法有MD5、SHA-1、SHA-256等。以下是一个生成SHA-256摘要的示例:

import java.security.MessageDigest;
import java.util.Base64;public class MessageDigestExample {public static void main(String[] args) throws Exception {String data = "Hello, World!";MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(data.getBytes());String hashString = Base64.getEncoder().encodeToString(hash);System.out.println("SHA-256 Hash: " + hashString);}
}
三、认证与授权

认证与授权是确保系统中用户身份和访问权限的关键机制。Java提供了JAAS(Java Authentication and Authorization Service)来实现这一功能。

1、JAAS认证

JAAS使用LoginModule进行用户认证,可以根据需要定制不同的LoginModule。以下是一个简单的JAAS认证示例:

首先,创建一个自定义的LoginModule:

import javax.security.auth.spi.LoginModule;
import javax.security.auth.Subject;
import javax.security.auth.callback.*;
import javax.security.auth.login.*;
import java.util.Map;public class SimpleLoginModule implements LoginModule {private Subject subject;private CallbackHandler callbackHandler;private String username;private char[] password;@Overridepublic void initialize(Subject subject, CallbackHandler callbackHandler, Map<String, ?> sharedState, Map<String, ?> options) {this.subject = subject;this.callbackHandler = callbackHandler;}@Overridepublic boolean login() throws LoginException {if (callbackHandler == null) {throw new LoginException("No CallbackHandler available.");}NameCallback nameCallback = new NameCallback("Username: ");PasswordCallback passwordCallback = new PasswordCallback("Password: ", false);Callback[] callbacks = new Callback[]{nameCallback, passwordCallback};try {callbackHandler.handle(callbacks);username = nameCallback.getName();password = passwordCallback.getPassword();// 假设用户名和密码是"admin"和"password"if ("admin".equals(username) && "password".equals(new String(password))) {return true;} else {throw new FailedLoginException("Invalid username or password.");}} catch (Exception e) {throw new LoginException(e.getMessage());}}@Overridepublic boolean commit() throws LoginException {// 验证成功后,可以添加特定的用户主体信息return true;}@Overridepublic boolean abort() throws LoginException {return false;}@Overridepublic boolean logout() throws LoginException {// 登出时的处理return true;}
}

然后,创建一个登录配置文件jaas.config

SimpleLoginModule {com.example.SimpleLoginModule required;
};

最后,编写一个使用JAAS进行认证的程序:

import javax.security.auth.login.LoginContext;
import javax.security.auth.login.LoginException;public class JAASExample {public static void main(String[] args) {System.setProperty("java.security.auth.login.config", "path/to/jaas.config");try {LoginContext lc = new LoginContext("SimpleLoginModule", new MyCallbackHandler());lc.login();System.out.println("Authentication successful!");} catch (LoginException e) {e.printStackTrace();}}
}

在这个示例中,MyCallbackHandler是一个自定义的回调处理程序,用于从用户获取认证信息:

import javax.security.auth.callback.*;public class MyCallbackHandler implements CallbackHandler {@Overridepublic void handle(Callback[] callbacks) throws UnsupportedCallbackException {for (Callback callback : callbacks) {if (callback instanceof NameCallback) {NameCallback nameCallback = (NameCallback) callback;nameCallback.setName("admin");} else if (callback instanceof PasswordCallback) {PasswordCallback passwordCallback = (PasswordCallback) callback;passwordCallback.setPassword("password".toCharArray());} else {throw new UnsupportedCallbackException(callback, "Unrecognized Callback");}}}
}

2、JAAS授权

在完成用户认证后,可以使用JAAS进行权限控制,即授权。授权基于用户的角色或组来确定其访问权限。

首先,创建一个简单的权限类:

import java.security.BasicPermission;public class MyPermission extends BasicPermission {public MyPermission(String name) {super(name);}
}

然后,配置权限策略文件java.policy

grant principal com.example.SimplePrincipal "admin" {permission com.example.MyPermission "access";
};

最后,编写授权检查代码:

import java.security.AccessController;
import java.security.PrivilegedAction;
import javax.security.auth.Subject;public class AuthorizationExample {public static void main(String[] args) {// 进行认证并获取Subject// ... 认证代码略Subject subject = ...; // 假设已获取认证后的Subject// 检查权限Subject.doAs(subject, (PrivilegedAction<Void>) () -> {try {AccessController.checkPermission(new MyPermission("access"));System.out.println("Access granted!");} catch (SecurityException e) {System.out.println("Access denied!");}return null;});}
}

在这个示例中,我们使用AccessController.checkPermission方法来检查用户是否具有特定的权限。

黑马程序员免费预约咨询

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/855430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 数据可视化 多色散点图

Python 数据可视化 多色散点图 fig, ax plt.subplots() max_line max([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) min_line min([max(merged_df[unif_ref_value]), max(merged_df[unif_rust_value])]) ax.plot([min_line, max_line], [min_line, …

【系统架构设计师】三、数据库系统(事务并发|封锁协议|数据库安全|商业智能|SQL语句)

目录 一、事务并发 1.1 事务概述 1.2 并发控制 1.3 封锁 1.3.1 X 封锁和 S 封锁 1.3.2 三级封锁协议 二、数据库安全 2.1 备份(转储)与恢复 2.2 备份分类 2.3 数据库故障 三、商业智能 3.1 数据仓库 3.2 数据仓库的结构-OLAP 3.3 数据挖掘 3.4 分布式数据库 四…

DDei在线设计器-API-DDei

DDei DDei是DDeiEditor的一个内置对象&#xff0c;实现了部分与图形显示有关但与设计器无关的功能、配置以及公共方法。 在图形内部一般不直接访问DDeiEditor&#xff0c;而是使用DDei&#xff0c;DDeiEditor的绝大多数初始化属性、回调函数等在DDei也能获取。。 本篇最后提供的…

研导AI写作:辅助创作的未来伙伴

人工智能&#xff08;AI&#xff09;写作技术正逐渐成为创作者们的强大助手。它不仅提高了写作效率&#xff0c;还拓展了创作的边界。本文将探讨AI写作的辅助作用&#xff0c;分析其如何在不同层面上促进人类创作的发展。 提升写作效率 AI写作的第一个辅助作用是提升写作效率…

GD32错误调试篇:串口通讯乱码/stm32移植到GD32后串口通讯乱码等问题

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 向上代码兼容GD32F450ZGT6中使用 后续项目主要在下面该专栏中发布&#xff1a; https://blog.csdn.net/qq_62316532/category_12608431.html?spm1001.2014.3001.5482 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转…

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

【JS】上传文件显示文件的为空,显示的文件参数内容只有uid

上传的文件参数file里面只包含uid&#xff0c;没有其他信息 例子解决办法 例子 例如使用elment ui的el-upload组件上传文件&#xff0c;会导致上传的文件参数file里面只包含uid&#xff0c;没有其他信息&#xff0c;如图&#xff1a; 正确应为如下图&#xff1a; 解决办法 …

云上战场:ToDesk云电脑、青椒云、顺网云全面对决

前言 记得端午放假期间&#xff0c;我已经在旅游的路上了&#xff0c;老板突然发短信&#xff0c;让我给他画个图&#xff0c;我手上的战斗机已经是十年前的老古董了(平常一直用的公司电脑&#xff0c;也没想过要换)&#xff0c;压根满足不了老板的任务要求&#xff0c;不得已&…

WPF 程序 分布式 自动更新 登录 打包

服务器server端 core api 客户端WPF // 检查应用更新 //1、获取最新文件列表 // var files fileService.GetUpgradeFiles(); // 2、文件判断&#xff0c;新增的直接下载&#xff1b;更新的直接下载&#xff1b;删除的直接删除 // 客户端本地需要一个记录…

SpringMVC系列三: Postman(接口测试工具)

接口测试工具 &#x1f49e;Postman(接口测试工具)Postman介绍Postman是什么Postman相关资源Postman安装Postman快速入门Postman完成Controller层测试其它说明 &#x1f49e;课后作业 上一讲, 我们学习的是SpringMVC系列二: 请求方式介绍 现在打开springmvc项目 &#x1f49e…

2024年十大数据集成工具和软件应用场景解析

详细阐述了十大数据集成工具及其优缺点&#xff1a; 数据集成的挑战 在当今的商业环境中&#xff0c;企业常常面临着数据分散、系统孤立的难题。传统的数据集成方式&#xff0c;就像一张复杂的蜘蛛网&#xff0c;难以理顺&#xff0c;令人头痛不已。 数据孤岛: 各个业务系统独立…

window.history()方法总结

window.history()方法总结 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; window.history是JavaScript中的一个内置对象&#xff0c;代表浏览器的历史记录。该…

【博士每天一篇文献-算法】Memory aware synapses_ Learning what (not) to forget

阅读时间&#xff1a;2023-12-13 1 介绍 年份&#xff1a;2018 作者&#xff1a;Rahaf Aljundi,丰田汽车欧洲公司研究员;阿卜杜拉国王科技大学(KAUST)助理教授;Marcus Rohrbach德国达姆施塔特工业大学多模式可靠人工智能教授 会议&#xff1a; Proceedings of the European c…

系统学习PLC

1.OB组织块 程序循环 PC ob1执行一次 ob123也执行一次 是 statup是程序启动的是第一个周期先执行starup&#xff08;0b100&#xff09;然后在执行ob1和0b123.这二个循环&#xff0c;周期执行这二个循环。1000是1s 2.DB块 建立指定数据块可以直接建立自己喜欢的类型 3.FB与…

轻量级 ioc/aop 框架 loveqq 1.0 发布,完全替换掉若依底层 spring 及其 starter

loveqq-framework 轻量级 ioc/aop 框架&#xff0c;比 spring 更强大的条件注解推断&#xff0c;打包后支持 jar index 启动。 本次更新&#xff1a; 正式更名为&#xff1a;loveqq-famework 新增&#xff1a;loveqq-boot-starter-mybatis 新增&#xff1a;loveqq-boot-start…

网络安全--安全设备(一)Dos

安全设备--Dos 一、Dos 是什么二、DDos是什么三、Dos&DDos的区别四、产品防御Dos&DDos方式五、常见的DDoS攻击类型包括但不限于以下几种&#xff1a; 一、Dos 是什么 Dos(拒绝服务攻击,Denial-of-Service)&#xff0c;是一种试图通过压倒网络或服务器来阻止合法用户访…

【八股系列】介绍React高阶组件,适用于什么场景?

文章目录 1. HOC的工作原理2. 返回的新组件3. 适用场景4. 注意事项5. 示例代码 React高阶组件&#xff08; Higher-Order Components&#xff0c;简称HOC&#xff09;是 React中一种高级的 复用组件逻辑的技术。 HOC自身不是 React API的一部分&#xff0c;而是基于 Reac…

如何优化频繁的v-if造成的页面卡顿

如何优化频繁的v-if造成的页面卡顿&#xff0c;只能用v-if 优化 1.将频繁的v-if转化为v-show&#xff1a;v-show与v-if有所不同。v-show会一直存在&#xff0c;只是CSS属性display被动态控制&#xff0c;而v-if则会根据条件在DOM中添加或移除元素。如果v-if出现频繁&#xff0c…

为何云原生是未来?企业IT架构的颠覆与重构(上)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《未来已来&#xff1a;云原生之旅》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、什么是云原生 2、云原生的背景和起源 背景 起源 关…

Android 查询及获取应用程序 Package 及 Acticity 名称的方法

一、通过命令查询和获取应用的Package及Acticity &#xff08;一&#xff09;通过命令查询应用包名及安装信息 以下是常用命令&#xff1a; 命令形式作用adb shell pm list packages查询系统中所有应用的包名adb shell pm list packages -s查询系统应用包名adb shell pm lis…