Java 安全:如何保护敏感数据?
Java 安全:如何保护敏感数据?
在当今数字化时代,数据安全成为了软件开发中至关重要的课题。对于 Java 开发者而言,掌握如何在 Java 应用中保护敏感数据是必备的技能。本文将深入探讨 Java 安全领域,聚焦于敏感数据保护的策略与实践,并结合详细代码示例,助力开发者构建更为安全可靠的 Java 应用程序。
一、Java 安全的重要性
随着互联网的飞速发展,应用程序所处理的数据量呈爆炸式增长,其中包含大量敏感信息,如用户的个人身份信息、财务数据、企业机密等。一旦这些敏感数据泄露,不仅会给用户带来巨大的损失,还会严重损害企业的声誉和利益,甚至可能面临法律诉讼。Java 作为广泛应用于企业级应用开发的编程语言,其应用的安全性备受关注。据相关安全报告显示,近年来针对 Java 应用的安全攻击事件呈现出上升趋势,其中敏感数据泄露问题尤为突出。因此,Java 开发者必须高度重视数据安全,采取有效的措施来保护敏感数据,确保应用程序在复杂的网络环境中稳定可靠地运行。
二、敏感数据加密技术
(一)对称加密
对称加密算法使用相同的密钥进行数据的加密和解密操作,具有加密速度快、加密效率高的特点,适用于大量数据的加密场景。常见的对称加密算法有 AES(Advanced Encryption Standard)等。以下是使用 AES 算法进行对称加密和解密的代码示例:
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;public class AESUtil {private static final String AES_ALGORITHM = "AES";// 生成 AES 密钥public static SecretKey generateKey() throws Exception {KeyGenerator keyGenerator = KeyGenerator.getInstance(AES_ALGORITHM);keyGenerator.init(256); // 初始化密钥长度为 256 位return keyGenerator.generateKey();}// AES 加密public static String encrypt(String plainText, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, secretKey);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}// AES 解密public static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(AES_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, secretKey);byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);}public static void main(String[] args) {try {// 生成密钥SecretKey secretKey = generateKey();// 待加密的明文String plainText = "Sensitive Data";// 加密操作String encryptedText = encrypt(plainText, secretKey);System.out.println("加密后的密文:" + encryptedText);// 解密操作String decryptedText = decrypt(encryptedText, secretKey);System.out.println("解密后的明文:" + decryptedText);} catch (Exception e) {e.printStackTrace();}}
}
(二)非对称加密
非对称加密算法使用一对密钥,即公钥和私钥。公钥用于加密数据,私钥用于解密数据,公钥可以公开,而私钥需要妥善保管。常见的非对称加密算法有 RSA(Rivest - Shamir - Adleman)等。以下是一个使用 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 RSAUtil {private static final String RSA_ALGORITHM = "RSA";// 生成 RSA 密钥对public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(RSA_ALGORITHM);keyPairGenerator.initialize(2048); // 初始化密钥对长度为 2048 位return keyPairGenerator.generateKeyPair();}// RSA 公钥加密public static String encrypt(String plainText, PublicKey publicKey) throws Exception {Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, publicKey);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes());return Base64.getEncoder().encodeToString(encryptedBytes);}// RSA 私钥解密public static String decrypt(String encryptedText, PrivateKey privateKey) throws Exception {Cipher cipher = Cipher.getInstance(RSA_ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] decodedBytes = Base64.getDecoder().decode(encryptedText);byte[] decryptedBytes = cipher.doFinal(decodedBytes);return new String(decryptedBytes);}public static void main(String[] args) {try {// 生成密钥对KeyPair keyPair = generateKeyPair();PublicKey publicKey = keyPair.getPublic();PrivateKey privateKey = keyPair.getPrivate();// 待加密的明文String plainText = "Sensitive Data";// 加密操作String encryptedText = encrypt(plainText, publicKey);System.out.println("加密后的密文:" + encryptedText);// 解密操作String decryptedText = decrypt(encryptedText, privateKey);System.out.println("解密后的明文:" + decryptedText);} catch (Exception e) {e.printStackTrace();}}
}
非对称加密相比于对称加密,在密钥管理方面更具优势,因为公钥可以随意分发,而私钥只需自己保管。然而,非对称加密的加密速度相对较慢,通常适用于加密少量数据或者加密对称加密算法的密钥等场景。
三、敏感数据的访问控制
在 Java 应用中,除了对敏感数据进行加密外,还需要严格控制对这些数据的访问权限,确保只有授权用户能够在合法的操作范围内访问敏感数据。
(一)基于角色的访问控制(RBAC)
RBAC 是一种常见的访问控制策略,它将用户分配到不同的角色中,每个角色具有特定的权限集合。通过定义适当的权限和角色分配,可以有效地控制用户对敏感数据的访问。以下是一个简单的 RBAC 模型实现代码示例:
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;public class RBACUtil {// 定义角色 - 权限映射private static final Map<String, Set<String>> rolePermissions = new HashMap<>();// 定义用户 - 角色映射private static final Map<String, Set<String>> userRoles = new HashMap<>();// 初始化 RBAC 模型static {// 添加角色权限Set<String> adminPermissions = new HashSet<>();adminPermissions.add("read_sensitive_data");adminPermissions.add("write_sensitive_data");rolePermissions.put("admin", adminPermissions);Set<String> userPermissions = new HashSet<>();userPermissions.add("read_sensitive_data");rolePermissions.put("user", userPermissions);// 添加用户角色Set<String> adminRoles = new HashSet<>();adminRoles.add("admin");userRoles.put("admin_user", adminRoles);Set<String> userRolesSet = new HashSet<>();userRolesSet.add("user");userRoles.put("normal_user", userRolesSet);}// 检查用户是否具有指定权限public static boolean hasPermission(String userId, String permission) {Set<String> roles = userRoles.get(userId);if (roles != null) {for (String role : roles) {Set<String> permissions = rolePermissions.get(role);if (permissions != null && permissions.contains(permission)) {return true;}}}return false;}public static void main(String[] args) {// 检查用户是否具有读取敏感数据的权限boolean adminHasReadPermission = hasPermission("admin_user", "read_sensitive_data");System.out.println("管理员用户是否具有读取敏感数据权限:" + adminHasReadPermission);boolean normalHasWritePermission = hasPermission("normal_user", "write_sensitive_data");System.out.println("普通用户是否具有写入敏感数据权限:" + normalHasWritePermission);}
}
(二)数据访问审计
数据访问审计是对用户访问敏感数据的行为进行记录和监控的过程,有助于及时发现异常访问行为和潜在的安全威胁。可以使用 Java 的日志框架(如 Log4j)来记录数据访问的日志信息。以下是一个简单的数据访问审计示例代码:
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;public class DataAccessAudit {private static final Logger logger = LogManager.getLogger(DataAccessAudit.class);// 记录数据访问日志public static void logDataAccess(String userId, String dataId, String action) {String logMessage = String.format("User: %s, Data: %s, Action: %s, Timestamp: %s",userId, dataId, action, System.currentTimeMillis());logger.info(logMessage);}public static void main(String[] args) {// 模拟数据访问行为并记录日志logDataAccess("user123", "data456", "read");logDataAccess("admin789", "data789", "write");}
}
通过分析这些审计日志,可以了解用户对敏感数据的访问情况,及时发现并处理未经授权的访问行为。
四、安全的数据传输
在 Java 应用与外部系统进行数据交互时,确保数据在传输过程中的安全性至关重要。应该使用安全的传输协议(如 HTTPS)来加密数据传输,防止数据在传输过程中被窃取或篡改。
(一)使用 HTTPS
在 Java 应用中,可以通过配置 Web 服务器(如 Apache Tomcat)来启用 HTTPS 协议。以 Tomcat 为例,可以在 Tomcat 的 server.xml 配置文件中添加如下配置:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"maxThreads="150" SSLEnabled="true"><SSLHostConfig><Certificate certificateKeystoreFile="conf/keystore.jks"certificateKeystorePassword="changeit"type="RSA" /></SSLHostConfig>
</Connector>
在使用 HTTPS 时,需要生成一个密钥库(keystore)文件,其中包含服务器的证书和私钥。通过 HTTPS 协议,客户端与服务器之间的数据传输将被加密,从而提高了数据传输的安全性。
(二)数据完整性校验
为了确保数据在传输过程中未被篡改,可以使用数字签名技术对数据进行完整性校验。以下是一个使用数字签名的代码示例:
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.util.Base64;public class DigitalSignature {private static final String SIGNATURE_ALGORITHM = "SHA256withRSA";// 生成密钥对public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);return keyPairGenerator.generateKeyPair();}// 生成数字签名public static String signData(String data, PrivateKey privateKey) throws Exception {Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);signature.initSign(privateKey);signature.update(data.getBytes());byte[] signatureBytes = signature.sign();return Base64.getEncoder().encodeToString(signatureBytes);}// 验证数字签名public static boolean verifySignature(String data, String signature, PublicKey publicKey) throws Exception {Signature signatureInstance = Signature.getInstance(SIGNATURE_ALGORITHM);signatureInstance.initVerify(publicKey);signatureInstance.update(data.getBytes());byte[] signatureBytes = Base64.getDecoder().decode(signature);return signatureInstance.verify(signatureBytes);}public static void main(String[] args) {try {// 生成密钥对KeyPair keyPair = generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();// 待签名的数据String data = "Sensitive Data";// 生成数字签名String signature = signData(data, privateKey);System.out.println("数字签名:" + signature);// 验证数字签名boolean isVerified = verifySignature(data, signature, publicKey);System.out.println("数字签名验证结果:" + isVerified);} catch (Exception e) {e.printStackTrace();}}
}
在数据传输过程中,发送方使用私钥对数据生成数字签名,接收方使用发送方的公钥对接收到的数据和数字签名进行验证,从而确保数据的完整性和真实性。
五、安全存储敏感数据
即使数据在传输过程中得到了保护,但如果存储不当,敏感数据仍然面临泄露风险。因此,在 Java 应用中,需要采取安全的存储策略来保护敏感数据。
(一)数据库加密存储
对于存储在数据库中的敏感数据,可以使用数据库提供的加密功能或者在应用层对数据进行加密后再存储到数据库。以下是一个在应用层使用 AES 加密将敏感数据存储到数据库的代码示例(以 H2 数据库为例):
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DatabaseEncryptionExample {private static final String DB_URL = "jdbc:h2:mem:testdb";private static final String CREATE_TABLE_SQL = "CREATE TABLE IF NOT EXISTS SensitiveData (id INT PRIMARY KEY, encrypted_data VARCHAR(255))";private static final String INSERT_SQL = "INSERT INTO SensitiveData (id, encrypted_data) VALUES (?, ?)";private static final String SELECT_SQL = "SELECT encrypted_data FROM SensitiveData WHERE id = ?";public static void main(String[] args) {try {// 1. 加载数据库驱动并建立连接Connection connection = DriverManager.getConnection(DB_URL, "sa", "");// 2. 创建表connection.createStatement().executeUpdate(CREATE_TABLE_SQL);// 3. 生成 AES 密钥(在实际应用中,密钥应妥善保管,不应硬编码)SecretKey secretKey = AESUtil.generateKey();// 4. 待存储的敏感数据String plainData = "Sensitive Data";// 5. 对敏感数据进行加密String encryptedData = AESUtil.encrypt(plainData, secretKey);// 6. 将加密后的数据存储到数据库PreparedStatement preparedStatement = connection.prepareStatement(INSERT_SQL);preparedStatement.setInt(1, 1);preparedStatement.setString(2, encryptedData);preparedStatement.executeUpdate();// 7. 从数据库查询加密数据并解密PreparedStatement selectStatement = connection.prepareStatement(SELECT_SQL);selectStatement.setInt(1, 1);ResultSet resultSet = selectStatement.executeQuery();if (resultSet.next()) {String retrievedEncryptedData = resultSet.getString("encrypted_data");String decryptedData = AESUtil.decrypt(retrievedEncryptedData, secretKey);System.out.println("从数据库中检索并解密后的数据:" + decryptedData);}// 8. 关闭资源resultSet.close();selectStatement.close();preparedStatement.close();connection.close();} catch (Exception e) {e.printStackTrace();}}
}
(二)安全配置管理
在 Java 应用中,配置文件(如数据库连接信息、加密密钥等)往往包含敏感信息。为了保护这些敏感配置信息,可以采取以下措施:
- 加密配置文件内容 :对配置文件中的敏感信息进行加密,只有在应用运行时才进行解密读取。可以使用对称加密或非对称加密算法来加密配置文件内容。
- 限制配置文件访问权限 :在文件系统层面,设置严格的访问权限,确保只有应用程序具有读取和写入配置文件的权限,防止其他用户或进程非法访问配置文件。
- 使用环境变量或密钥管理系统 :将敏感配置信息存储在环境变量或专业的密钥管理系统中,而不是直接写在配置文件中。在应用启动时,通过读取环境变量或调用密钥管理系统接口来获取敏感配置信息。
六、Java 应用的安全漏洞防护
在 Java 开发过程中,除了主动采取措施保护敏感数据外,还需要关注 Java 应用本身可能存在的安全漏洞,并及时进行修复和防护。
(一)防止 SQL 注入
SQL 注入是一种常见的安全攻击方式,攻击者通过在输入中注入恶意 SQL 代码,从而对数据库进行未授权的访问和操作。在 Java 应用中,可以使用预编译 SQL 语句(PreparedStatement)来有效防止 SQL 注入。以下是一个使用 PreparedStatement 防止 SQL 注入的代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class SQLInjectionPreventionExample {private static final String DB_URL = "jdbc:h2:mem:testdb";private static final String CREATE_TABLE_SQL = "CREATE TABLE IF NOT EXISTS Users (id INT PRIMARY KEY, username VARCHAR(50), password VARCHAR(50))";private static final String INSERT_SQL = "INSERT INTO Users (id, username, password) VALUES (?, ?, ?)";private static final String SELECT_SQL = "SELECT * FROM Users WHERE username = ? AND password = ?";public static void main(String[] args) {try {// 1. 加载数据库驱动并建立连接Connection connection = DriverManager.getConnection(DB_URL, "sa", "");// 2. 创建表connection.createStatement().executeUpdate(CREATE_TABLE_SQL);// 3. 插入用户数据PreparedStatement insertStatement = connection.prepareStatement(INSERT_SQL);insertStatement.setInt(1, 1);insertStatement.setString(2, "user1");insertStatement.setString(3, "password123");insertStatement.executeUpdate();// 4. 模拟用户输入的用户名和密码(可能包含恶意 SQL 代码)String userInputUsername = "user1' OR '1'='1";String userInputPassword = "password123";// 5. 使用预编译 SQL 语句防止 SQL 注入PreparedStatement selectStatement = connection.prepareStatement(SELECT_SQL);selectStatement.setString(1, userInputUsername);selectStatement.setString(2, userInputPassword);ResultSet resultSet = selectStatement.executeQuery();if (resultSet.next()) {System.out.println("登录成功!");} else {System.out.println("登录失败!");}// 6. 关闭资源resultSet.close();selectStatement.close();insertStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
通过使用 PreparedStatement,用户输入的参数会被正确地处理为 SQL 语句的参数,而不是直接拼接到 SQL 语句中执行,从而有效防止了 SQL 注入攻击。
(二)防止 XSS 攻击
XSS(Cross - Site Scripting,跨站脚本攻击)是指攻击者将恶意脚本代码注入到网页中,当其他用户浏览该网页时,恶意脚本会在其浏览器中执行,从而窃取用户信息或进行其他恶意操作。在 Java Web 开发中,可以对用户输入的数据进行过滤和编码,以防止 XSS 攻击。以下是一个简单的防止 XSS 攻击的代码示例:
import java.util.regex.Pattern;public class XSSPreventionUtil {// 过滤 XSS 攻击的正则表达式模式private static final Pattern XSS_PATTERN = Pattern.compile("(<\\s*script\\s*>|<\\s*img\\s+src\\s*=|<\\s*a\\s+href\\s*=|javascript:|onerror=|onload=|onmouseover=|onmouseout=|onmousedown=|onmouseup=|ondblclick=|oncontextmenu=|onkeydown=|onkeypress=|onkeyup=|onabort=|onbeforeunload=|onerror=|onhashchange=|onload=|onpageshow=|onpagehide=|onresize=|onscroll=|onselect=|onsubmit=|onunload=|onfocus=|onblur=|onchange=|oninput=|onreset=|onsearch=|onselect=|onsubmit=|onclick=|<\\s*iframe\\s+src\\s*=|<\\s*object\\s+data\\s*=|<\\s*embed\\s+src\\s*=)", Pattern.CASE_INSENSITIVE);// 过滤 XSS 攻击public static String filterXSS(String data) {if (data == null) {return null;}return XSS_PATTERN.matcher(data).replaceAll("");}// 对输出内容进行 HTML 编码以防止 XSS 攻击public static String encodeForHTML(String data) {if (data == null) {return null;}return data.replace("&", "&").replace("<", "<").replace(">", ">").replace("\"", """).replace("'", "'");}public static void main(String[] args) {// 模拟用户输入的包含 XSS 攻击代码的数据String userInput = "<script>alert('XSS Attack')</script>";// 过滤 XSS 攻击String filteredData = filterXSS(userInput);System.out.println("过滤后的数据:" + filteredData);// 对输出内容进行 HTML 编码String encodedData = encodeForHTML(filteredData);System.out.println("HTML 编码后的数据:" + encodedData);}
}
在 Java Web 应用中,对用户输入的数据进行过滤,去除可能包含的恶意脚本代码,并对输出到网页的内容进行 HTML 编码,可以有效防止 XSS 攻击,保护用户信息的安全。
七、安全审计与监控
为了及时发现和响应 Java 应用中的安全事件,需要建立安全审计与监控机制。
(一)定期安全审计
定期对 Java 应用的代码、配置、数据存储等方面进行全面的安全审计,检查是否存在潜在的安全漏洞和风险。可以使用专业的安全审计工具(如 SonarQube)来辅助审计工作,发现代码中的安全问题,并及时进行修复。
(二)实时监控与报警
通过部署安全监控工具(如 intrusion detection systems, IDS),对 Java 应用的运行状态进行实时监控,及时发现异常行为和安全威胁。当检测到安全事件时,能够及时发出报警通知,以便安全团队迅速采取措施进行处理。
八、总结
在 Java 开发中,保护敏感数据是保障应用安全的关键环节。通过采用多种安全策略和技术手段,如数据加密、访问控制、安全传输、安全存储以及防范安全漏洞等,可以有效降低敏感数据泄露的风险,提高 Java 应用的安全性。同时,建立完善的安全审计与监控机制,能够及时发现和响应安全事件,进一步增强应用的安全防护能力。作为 Java 开发者,应持续关注安全领域的最新动态和技术发展,不断提升自身的安全意识和技能水平,为构建安全可靠的 Java 应用贡献力量。
相关文章:
Java 安全:如何保护敏感数据?
Java 安全:如何保护敏感数据? 在当今数字化时代,数据安全成为了软件开发中至关重要的课题。对于 Java 开发者而言,掌握如何在 Java 应用中保护敏感数据是必备的技能。本文将深入探讨 Java 安全领域,聚焦于敏感数据保护…...
PySpark实现ABC_manage_channel逻辑
问题描述 我们需要确定"ABC_manage_channel"列的逻辑,该列的值在客户连续在同一渠道下单时更新为当前渠道,否则保留之前的值。具体规则如下: 初始值为第一个订单的渠道如果客户连续两次在同一渠道下单,则更新为当前渠…...
栈与堆的演示
1、栈与堆的演示 (1)网页视图 (2)代码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, in…...
【Kafka】Windows环境下生产与消费流程详解(附流程图)
1. 背景说明 在搭建基于Kafka的数据流通系统(例如流式推荐、实时日志采集)时,常见的操作是: 生产者 Producer 向 Kafka Topic 写入消息消费者 Consumer 从 Kafka Topic 读取消息本文以Windows本地环境 + Kafka 2.8.1版本为例,手把手演示生产消费流程。 2. 准备条件 Kafka…...
基于FFmpeg命令行的实时图像处理与RTSP推流解决方案
前言 在一些项目开发过程中需要将实时处理的图像再实时的将结果展示出来,此时如果再使用一张一张图片显示的方式展示给开发者,那么图像窗口的反复开关将会出现窗口闪烁的问题,实际上无法体现出动态画面的效果。因此,需要使用码流…...
神经网络笔记 - 感知机
一 感知机是什么 感知机(Perceptron)是一种接收输入信号并输出结果的算法。 它根据输入与权重的加权和是否超过某个阈值(threshold),来判断输出0还是1。 二.计算方式 感知机的基本公式如下: X1, X2 : …...
【双指针】专题:LeetCode 15题解——三数之和
三数之和 一、题目链接二、题目三、题目解析四、算法原理解法一:排序 暴力枚举 利用set去重解法二:排序 双指针处理细节问题1、去重越界问题 2、不漏 五、编写代码六、时间复杂度和空间复杂度 一、题目链接 三数之和 二、题目 三、题目解析 i ! j …...
如何创建一个导入模板?全流程图文解析
先去找到系统内可以上传东西的按钮 把你的模板上传上去,找到对应的fileName 图里的文字写错了,是复制粘贴"filePath"到URL才能下载...
JS自动化获取网站信息开发说明
一、自动获取信息的必要性 1. 提高效率与节省时间 批量处理:自动化可以快速抓取大量数据,比人工手动操作快得多。 24/7 运行:自动化工具可以全天候工作,不受时间限制。 减少重复劳动:避免人工反复执行相同的任务&am…...
Python爬虫-爬取汽车之家各品牌月销量榜数据
前言 本文是该专栏的第54篇,后面会持续分享python爬虫干货知识,记得关注。 在本文中,笔者已整理19篇汽车平台相关的爬虫项目案例。对此感兴趣的同学,可以直接翻阅查看。 而本文,笔者将以汽车之家平台为例子。基于Python爬虫,实现批量爬取“各品牌月销量榜”的数据。废话…...
WPF 调用 OpenCV 库
WPF 调用 OpenCV 库指南 OpenCV 是一个强大的计算机视觉库,WPF 是 Windows 平台的 UI 框架。将两者结合可以实现强大的图像处理和计算机视觉应用。本文将详细介绍如何在 WPF 应用程序中集成和使用 OpenCV 库。 一、准备工作 1. 安装 OpenCV 方法一:通过 NuGet 安装 在 Vi…...
LLM(大语言模型)技术的最新进展可总结
截至2025年4月26日,LLM(大语言模型)技术的最新进展可总结为以下关键方向: 1. 架构创新与性能突破 多模态能力深化:GPT-4o等模型通过统一架构支持文本、图像、音频和视频的跨模态推理,显著提升复杂场景下的…...
Fedora 43 计划移除所有 GNOME X11 相关软件包
Fedora 43 计划移除所有 GNOME X11 相关软件包,这是 Fedora 项目团队为全面拥抱 Wayland 所做的重要决策。以下是关于此计划的详细介绍: 提案内容:4 月 23 日,Neal Gompa 提交提案,建议从 Fedora 软件仓库中移除所有 G…...
解构与重构:“整体部分”视角下的软件开发思维范式
在软件开发的复杂图景中,整体与部分的关系始终是决定项目成败的关键命题。《人月神话》“整体部分”一章以深邃的洞察力,揭示了软件开发过程中系统设计与实现的内在逻辑,不仅探讨了规格说明、设计方法等技术层面的核心要素,更深入…...
NdrpConformantVaryingArrayUnmarshall函数分析--重要
第一部分: void NdrpConformantVaryingArrayUnmarshall( PMIDL_STUB_MESSAGE pStubMsg, uchar ** ppMemory, PFORMAT_STRING pFormat, uchar fMustCopy, uchar fMustAlloc ) { uchar * …...
ZYNQ笔记(十四):基于 BRAM 的 PS、PL 数据交互
版本:Vivado2020.2(Vitis) 实验任务: PS 将字符串数据写入BRAM,再将数据读取出来;PL 从 BRAM 中读取数据,bing。通过 ILA 来观察读出的数据,与前面串口打印的数据进行对照࿰…...
月之暗面开源 Kimi-Audio-7B-Instruct,同时支持语音识别和语音生成
我们向您介绍在音频理解、生成和对话方面表现出色的开源音频基础模型–Kimi-Audio。该资源库托管了 Kimi-Audio-7B-Instruct 的模型检查点。 Kimi-Audio 被设计为通用的音频基础模型,能够在单一的统一框架内处理各种音频处理任务。主要功能包括: 通用功…...
文件操作及读写-爪哇版
文章目录 前言 初识文件文件路径里的符号文件分类文件操作方法文件读写字节流输入输出输入输出 字符流输入输出输入输出 前言 Windows用户需知:“/”和“\”, 文件路径分隔符一般都用“/”,但Windows系统一直保留着“\”,这两种符…...
【matlab】绘制maxENT模型的ROC曲线和omission curve
文章目录 一、maxENT模型二、ROC曲线三、实操3.1 数据提取3.2 绘制ROC曲线3.3 绘制遗漏曲线3.4 多次训练的ROC和测试的ROC 一、maxENT模型 前面的文章已经详细讲过了。 maxENT软件运行后,会生成一个html报告,里面有ROC曲线,但我们往往需要自…...
个人电子白板(svg标签电子画板功能包含正方形、文本、橡皮 (颜色、尺寸、不透明度)、 撤销、取消撤销 等等功能,)
在Http开发中,svg标签电子画板功能包含正方形、文本、橡皮 (颜色、尺寸、不透明度)、 撤销、取消撤销 等等功能, 效果图 代码如下: <!DOCTYPE html> <html lang"en"> <!--<link href&qu…...
Pygame终极项目:从零开发一个完整2D游戏
Pygame终极项目:从零开发一个完整2D游戏 大家好!欢迎来到本期的Pygame教程。今天,我们将从零开始开发一个完整的2D游戏。通过这个项目,你将学习到如何使用Pygame库来创建游戏窗口、处理用户输入、绘制图形、管理游戏状态、实现碰撞检测和音效等。无论你是初学者还是有一定…...
在应用运维过程中,业务数据修改的证据留存和数据留存
在应用运维过程中,业务数据修改的证据留存和数据留存至关重要,以下是相关介绍: 一、证据留存 操作日志记录 : 详细记录每一次业务数据修改的操作日志,包括操作人员、操作时间、修改内容、修改前后数据的对比等。例如,某公司业务系统中,操作日志会精确记录员工小张在 2…...
JAVA JVM面试题
你的项目中遇到什么问题需要jvm调优,怎么调优的,堆的最小值和最大值设置为什么不设置成一样大? 在项目中,JVM调优通常源于以下典型问题及对应的调优思路,同时关于堆内存参数(-Xms/-Xmx)的设置逻…...
C盘爆红如何解决
deepseek来试用一下! 一、快速释放空间 1. 清理临时文件 - **Win R** 输入 %temp% → 删除文件夹内所有内容。 - **Win S** 搜索 “磁盘清理”** → 选择C盘 → 勾选“临时文件”“系统缓存”等 → 点击“清理系统文件”(可额外清理Windows…...
在 Ubuntu24.04 LTS 上 Docker 部署英文版 n8n 和 部署中文版 n8n-i18n-chinese
一、n8n 简介 n8n 是一个低代码(Low-Code)工作流自动化平台,可以帮助用户以非常简单的方式创建自动化流程,连接不同的应用程序和服务。n8n的设计理念是为了让复杂的工作流变得简单易用,同时也支持高度的自定义…...
软件设计案例分析学习笔记
1.软件设计师内容小考 一、单选题 1.(单选题,1.0 分) 下列内聚种类中,内聚程度最高的是 ( )。 A. 功能内聚 B. 逻辑内聚 C. 偶然内聚 D. 过程内聚 第 1 题: 答案:A 解析:功能内聚是指模块内所有元素共同完成一个功能&a…...
魔百盒CM311-3-YST代工-晨星MSO9385芯片-2+8G-免拆卡刷通刷固件包
魔百盒CM311-3-YST代工-晨星MSO9385芯片-28G-免拆卡刷通刷固件包 刷机前准备: 准备一个8G或一下容量的优盘将其格式化为fat32格式;(切记不要用做过电脑系统的优盘,不然刷机直接变砖); 优盘卡刷强刷刷机&am…...
nginx 504 (Gateway Time-out)
目录 1. 后端处理超时 2. Nginx 代理超时设置不足 3. 服务未响应或崩溃 4. 请求体过大 5. 重启nginx 原本代理服务器用的是微软的Kestrel ,今天给项目换用了nginx,然后有个接口请求报了 (504 Gateway Timeout) 请求发送到了…...
WPF 实现PLC数据采集
WPF 数据采集网关系统设计与实现 一、系统概述 本系统是一个基于 WPF 的数据采集网关,支持主流 PLC(可编程逻辑控制器)的数据采集,并将采集到的数据汇总存储到数据库中。系统采用模块化设计,具有良好的扩展性和可维护性。 二、系统架构 1. 整体架构 +---------------…...
llama factory怎么命令行推理图片
根据LLaMA-Factory多模态数据处理规范,配置图片输入需注意以下核心要点: --- **一、本地图片路径配置** 1. 绝对路径配置: json "images": ["/home/user/project/data/mllm_demo_data/1.jpg"] *适用场景*…...
计算机网络 | 应用层(1)--应用层协议原理
💓个人主页:mooridy 💓专栏地址:《计算机网络:自定向下方法》 大纲式阅读笔记 关注我🌹,和我一起学习更多计算机的知识 🔝🔝🔝 目录 1. 应用层协议原理 1.1 …...
刚体运动 (位置向量 - 旋转矩阵) 笔记 1.1~1.3 (台大机器人学-林沛群)
目录 1. 理解刚体的“自由度”(Degrees of Freedom, DOF) 1.1 平面运动 (2D) 1.2 空间运动 (3D) 2. 统一描述:引入“体坐标系”(Body Frame) 3. 从“状态”到“运动”:引入微分 3.1 补充:…...
MES系列-MOM(Manufacturing Operations Management,制造运营管理)
MES系列文章目录 ISA-95制造业中企业和控制系统的集成的国际标准-(1) ISA-95制造业中企业和控制系统的集成的国际标准-(2) ISA-95制造业中企业和控制系统的集成的国际标准-(3) ISA-95制造业中企业和控制系统的集成的国际标准-(4) ISA-95制造业中企业和控制系统的集成的国际标准…...
矩阵系统私信功能开发技术实践,支持OEM
在短视频矩阵系统中,私信功能是连接运营者与用户、用户与用户的重要桥梁。它不仅能提升用户粘性,还能为精准营销提供支持。本文将从需求分析、技术选型、核心功能实现到性能优化,全面解析矩阵系统私信功能的开发过程。 一、功能需求分析 &am…...
leetcode 26和80
leetcode 26. Remove Duplicates from Sorted Array 代码: class Solution { public:int removeDuplicates(vector<int>& nums) {int len nums.size();int slowIdx 1;for(int firstIdx 1; firstIdx < len;firstIdx){if(nums[firstIdx] ! nums[firs…...
微信小程序 template 模版详解
一、什么时候使用template ? 代码复用,维护方便,提高性能 二、模版的基本使用 三、模版样式的使用 四、使用模版 五、使用模版定义的样式,需要在引入的wxml 样式文件中导入样式 六、template模版...扩展符数据传递 可以根据自己…...
北斗导航 | 基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究
基于Transformer+LSTM+激光雷达的接收机自主完好性监测算法研究 接收机自主完好性监测(RAIM)是保障全球导航卫星系统(GNSS)定位可靠性的核心技术。传统RAIM算法依赖最小二乘残差法,存在故障漏检、对复杂环境适应性差等问题。结合Transformer、LSTM与激光雷达的多模态融合…...
ASP.NET CORE部署IIS的三种方式
ASP.NET Core 部署方式对比 本文档对比了三种常见的 ASP.NET Core 应用(如你的 DingTalkApproval 项目)部署到 Windows 10 上 IIS 服务器的方式:dotnet publish(手动部署)、Web Deploy(直接发布到 IIS&…...
推荐三款GitHub上高星开源的音乐搜索平台
文章目录 一、Spottube 1. 展示 2. 功能 3. 安装 二、YesPlayMusic 1. 展示 2. 功能 2. 安装 三、Navidrome 1. 展示 2. 功能 3. 安装 一、Spottube 一个开源的跨平台 Spotify 客户端,兼容多个平台,利用 Spotify 的数据 API 和 YouTube、P…...
Linux基础指令【上】
Linux的基本操作 , 是通过指令来执行的! 小贴士:指令很多,但一定要摒弃那种看到知识点就全部死记硬背的坏习惯(因为就算背,也背不完) , 一定要以理解为主,练习为辅 &…...
GPT系列模型-20250426
文章目录 🧠 GPT-4o(Omni)🔬 GPT-4.5(研究预览)🧩 o3 模型系列(o3、o3-mini、o3-mini-high)🧠 o4-mini 和 o4-mini-high🧠 GPT-4o mini🧾 总结对比表🧠 GPT-4o(Omni) 特点:全能型模型,支持文本、图像、音频和视频输入输出,具备强大的多模态处理能力。…...
高精度运算(string函数)
高精度加法 #include<iostream> #include<string> #include<algorithm> using namespace std; string _add(string s1,string s2); int main() {string a,b;cin>>a>>b;cout<<_add(a,b);return 0; } string _add(string s1,string s2) {re…...
探索 AI 在文化遗产保护中的新使命:数字化修复与传承
文化遗产是人类文明的瑰宝,承载着历史的记忆与文化的灵魂。然而,随着时间的推移和自然环境的影响,许多珍贵的文化遗产正面临着损毁和消失的威胁。在这样的背景下,人工智能(AI)技术的出现为文化遗产的保护和…...
Python----深度学习(基于DNN的PM2.5预测)
一、目标 如何使用 PyTorch 实现一个简单的深度神经网络(DNN)模型,并用于回归任务。该模型通过训练数据集来预测PM2.5。代码通过读取数据集、数据处理、模型训练和模型评估等步骤,详细展示了整个实现过程。 二、数据集介绍 Data …...
Android12源码编译及刷机
由于google的AOSP源码拉取经常失败,编译还经常出现各种问题。这里根据香橙派Orange Pi 5 Plus(Android12电视镜像)源码进行编译演示。 RK芯片的开发板可玩性很高,这里以电视版本android系统为例子,学习的同时还可以当…...
TRO再添新案 TME再拿下一热门IP,涉及Paddington多个商标
4月2日和4月8日,TME律所代理Paddington & Company Ltd.对热门IP Paddington Bear帕丁顿熊的多类商标发起维权,覆盖文具、家居用品、毛绒玩具、纺织用品、游戏、电影、咖啡、填充玩具等领域。跨境卖家需立即排查店铺内的相关产品! 案件基…...
如何使用 Spring Boot 实现分页和排序:配置与实践指南
在现代 Web 应用开发中,分页和排序是处理大量数据时提升用户体验和系统性能的关键功能。Spring Boot 结合 Spring Data JPA 提供了简单而强大的工具,用于实现数据的分页查询和动态排序,广泛应用于 RESTful API、后台管理系统等场景。2025 年&…...
asammdf 库的信号处理和数据分析:深入挖掘测量数据
内容概要: 信号处理的基本操作数据分析和统计数据可视化和报告生成 正文: 信号处理的基本操作 asammdf 提供了对信号的基本操作,包括读取、筛选和转换。 读取信号 with asammdf.MDF(nameexample.mf4) as mdf:engine_speed …...
在springboot项目中,如何进行excel表格的导入导出功能?
以下是使用 Apache POI 和 EasyExcel 实现 Excel 表格导入导出功能的具体代码示例。 1. 使用 Apache POI 实现 Excel 导入导出 添加依赖 在 pom.xml 中添加 Apache POI 的依赖: <dependency><groupId>org.apache.poi</groupId><artifactId…...
【C++11】右值引用和移动语义:万字总结
📝前言: 这篇文章我们来讲讲右值引用和移动语义 🎬个人简介:努力学习ing 📋个人专栏:C学习笔记 🎀CSDN主页 愚润求学 🌄其他专栏:C语言入门基础,python入门基…...