如何掌握 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 分布式数据库 四…

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;令人头痛不已。 数据孤岛: 各个业务系统独立…

【博士每天一篇文献-算法】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与…

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

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

为何云原生是未来?企业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…

MySQL 函数

1、CURDATE()&#xff1a;返回当前的日期。 2、查询当前年月 SELECT DATE_FORMAT(CURDATE(),%Y-%m) AS year_month 3、当前日期添加 1 个月 INTERVAL 1 MONTH 4、查询近6个月的月份 SELECT DATE_FORMAT(CURDATE(),%Y-%m)AS year_month UNION SELECT DATE_FORMAT((CURDAT…

【网络安全学习】使用Kali做信息收集 -03- <综合侦察>

综合侦察涉及从多个来源收集和分析目标的信息&#xff0c;以了解其背景、特征、潜在漏洞和风险。 下面介绍一些在Kali中常用的综合侦察工具。 1.Dmitry 它是一个命令行工具&#xff0c;可以使用不同的选项来收集目标的各种信息。 Dmitry可以与whois服务和Netcraft服务结合使…

【启明智显产品介绍】Model4 工业级HMI芯片详解系列专题(一):芯片性能

Model4 工业级HMI芯片详解系列专题&#xff08;一&#xff09;【芯片性能】 Model4系列工业级MPU是国产自主面向工业应用的RISC-V架构的应用级芯片&#xff0c;内置玄铁64bit RISC-V CPU C906&#xff0c;主频高达600MHz&#xff0c;算力约1380DMIPS。 Model4系列工业级MPU具…

BizDevOps全局建设思路:横向串联,纵向深化

本文来自腾讯蓝鲸智云社区用户&#xff1a;CanWay BizDevOps概述 IT技术交付实践方法在不断迭代中持续优化。在工业化时代&#xff0c;Biz&#xff08;业务&#xff09;、Dev&#xff08;开发&#xff09;、Ops&#xff08;运维&#xff09;三者往往相对分离&#xff0c;甚至有…

Transformer预测 | 基于Transformer+LSTM股票价格预测时间序列预测(Pytorch)

效果一览 基本介绍 股票行情是引导交易市场变化的一大重要因素,若能够掌握股票行情的走势,则对于个人和企业的投资都有巨大的帮助。然而,股票走势会受到多方因素的影响,因此难以从影响因素入手定量地进行衡量。但如今,借助于机器学习,可以通过搭建网络,学习一定规模的股…

API-操作元素内容

学习目标&#xff1a; 掌握操作元素内容 学习内容&#xff1a; 操作元素内容元素innerText属性元素innerHTML属性案例 操作元素内容&#xff1a; DOM对象都是根据标签生成的&#xff0c;所以操作标签&#xff0c;本质上就是操作DOM对象。就是操作对象使用的点语法。如果想要修…