Crypto、Cipher与Password:Java加密开发的三个核心概念 📅 发布时间:2026/7/11 21:58:46 👁️ 浏览次数: Java安全开发中有三个极易混淆的术语Crypto、Cipher和Password。它们的中文翻译都与“密码”有关但在计算机科学中各自承担着截然不同的角色。Crypto密码学的总称是一个领域或工具箱Cipher加密/解密的具体算法或工具Password用户输入的身份认证凭据理解这三者的区别是写出安全、正确的Java加密代码的第一步。本文将从概念辨析到实战代码带你彻底理清这三个核心概念。回到顶部一、Crypto密码学的总称Crypto是Cryptography密码学 的缩写词源来自希腊语kryptós隐藏/秘密。它是一个宏观概念涵盖了整个密码学领域——包括加密、解密、哈希、数字签名、密钥交换、消息认证码MAC等所有相关技术。在Java中javax.crypto包就是“Crypto”的具体体现。根据官方文档该包“为加密操作提供类和接口”涵盖的操作包括加密、密钥生成和密钥协商、消息认证码MAC生成等。类比理解Crypto就像“厨房”——整个烹饪的场所。里面有不同的区域洗菜、切菜、炒菜、烘焙有各种各样的工具。Crypto ≠ CipherCrypto是整个领域Cipher只是这个领域下的一个具体工具。回到顶部二、CipherJava加密的核心引擎2.1 什么是Cipherjavax.crypto.Cipher是Java加密扩展JCEJava Cryptography Extension框架的核心类提供加密和解密的密码功能。它不保存数据而是执行具体的加解密运算。用官方文档的话说“此类为加密和解密提供密码功能构成了JCE框架的核心。”2.2 Cipher的核心概念Transformation转换模式创建Cipher对象时需要指定一个转换模式Transformation 格式为算法/工作模式/填充模式例如Cipher c Cipher.getInstance(“AES/CBC/PKCS5Padding”);三个组成部分的含义组成部分 说明 示例算法 具体的加密算法 AES、DES、RSA工作模式 分组密码的处理方式仅对分组密码有效 ECB、CBC、GCM、CTR填充模式 数据长度不足块大小时如何补齐 PKCS5Padding、NoPadding工作模式的选择直接影响安全性ECB电子密码本 相同明文生成相同密文不安全不推荐使用CBC密码分组链接 需要随机IV比ECB安全GCM伽罗瓦/计数器模式 AEAD模式同时提供加密和认证现代推荐首选2.3 Cipher的核心方法使用Cipher的标准流程// 1. 创建Cipher实例Cipher cipher Cipher.getInstance(“AES/GCM/NoPadding”);// 2. 初始化指定模式 密钥cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 3. 执行加密/解密byte[] result cipher.doFinal(inputData);关键方法说明getInstance(String transformation)创建Cipher实例init(int opmode, Key key)初始化指定加密/解密模式和密钥update(byte[] input)分块处理数据适用于大数据doFinal(byte[] input)完成加密/解密操作2.4 完整代码示例AES-GCM加密解密import javax.crypto.Cipher;import javax.crypto.KeyGenerator;import javax.crypto.SecretKey;import javax.crypto.spec.GCMParameterSpec;import java.security.SecureRandom;import java.util.Base64;public class AesGcmExample {// GCM推荐使用96位12字节IV private static final int GCM_IV_LENGTH 12; private static final int GCM_TAG_LENGTH 128; public static void main(String[] args) throws Exception { // 1. 生成AES密钥256位 KeyGenerator keyGen KeyGenerator.getInstance(AES); keyGen.init(256); SecretKey secretKey keyGen.generateKey(); String plaintext Hello, 这是一个敏感数据; // 2. 加密 byte[] ciphertext encrypt(plaintext, secretKey); System.out.println(密文(Base64): Base64.getEncoder().encodeToString(ciphertext)); // 3. 解密 String decrypted decrypt(ciphertext, secretKey); System.out.println(解密结果: decrypted); } public static byte[] encrypt(String plaintext, SecretKey key) throws Exception { // 生成随机IV byte[] iv new byte[GCM_IV_LENGTH]; SecureRandom.getInstanceStrong().nextBytes(iv); Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); GCMParameterSpec spec new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.ENCRYPT_MODE, key, spec); byte[] ciphertext cipher.doFinal(plaintext.getBytes(UTF-8)); // 将IV和密文合并IV 密文 byte[] result new byte[iv.length ciphertext.length]; System.arraycopy(iv, 0, result, 0, iv.length); System.arraycopy(ciphertext, 0, result, iv.length, ciphertext.length); return result; } public static String decrypt(byte[] encrypted, SecretKey key) throws Exception { // 分离IV和密文 byte[] iv new byte[GCM_IV_LENGTH]; byte[] ciphertext new byte[encrypted.length - GCM_IV_LENGTH]; System.arraycopy(encrypted, 0, iv, 0, GCM_IV_LENGTH); System.arraycopy(encrypted, GCM_IV_LENGTH, ciphertext, 0, ciphertext.length); Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); GCMParameterSpec spec new GCMParameterSpec(GCM_TAG_LENGTH, iv); cipher.init(Cipher.DECRYPT_MODE, key, spec); byte[] plaintext cipher.doFinal(ciphertext); return new String(plaintext, UTF-8); }}注意GCM模式要求每次加密使用不同的IV重复使用IV会引发伪造攻击。回到顶部三、Password用户身份认证的凭据3.1 什么是PasswordPassword口令/密码 是用户用于身份验证的一组字符串。它是“你输入的那个东西”——比如登录系统时输入的mySecret123。3.2 Password与Cipher的本质区别维度 Cipher加密器 Password口令本质 算法/工具 数据/凭据作用 执行加密/解密运算 验证用户身份在代码中 Cipher类的实例 String或char[]变量是否可逆 可逆加密后可解密 不可逆存储存哈希值安全性依赖 算法强度和密钥管理 密码复杂度和存储方式3.3 重要规则Cipher不能直接使用PasswordCipher不接受String类型的Password作为密钥AES算法要求密钥长度必须是16、24或32字节而用户输入的Password如123456长度不固定。必须通过密钥派生函数KDF 将Password转化为固定长度的SecretKey。// ❌ 错误Cipher不能直接使用PasswordString password “mySecret123”;Cipher cipher Cipher.getInstance(“AES/GCM/NoPadding”);cipher.init(Cipher.ENCRYPT_MODE, password); // 编译错误// ✅ 正确通过PBKDF2派生密钥String password “mySecret123”;byte[] salt new byte[16];new SecureRandom().nextBytes(salt);PBEKeySpec spec new PBEKeySpec(password.toCharArray(),salt,10000, // 迭代次数256 // 密钥长度位);SecretKeyFactory factory SecretKeyFactory.getInstance(“PBKDF2WithHmacSHA256”);SecretKey key factory.generateSecret(spec);// 现在key可以作为Cipher的密钥Cipher cipher Cipher.getInstance(“AES/GCM/NoPadding”);cipher.init(Cipher.ENCRYPT_MODE, key);3.4 Password的存储加盐哈希Password绝不能明文存储。正确的做法是使用加盐哈希如bcrypt、Argon2进行不可逆存储。// 使用Spring Security的BCryptBCryptPasswordEncoder encoder new BCryptPasswordEncoder();String hashedPassword encoder.encode(“userPassword”); // 存储此值boolean isValid encoder.matches(“userPassword”, hashedPassword); // 验证回到顶部四、三者关系全景图┌─────────────────────────────────────────────────────────────────┐│ CRYPTO密码学 ││ 整个加密领域的总称 ││ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ││ │ 哈希算法 │ │ 数字签名 │ │ 密钥交换 │ ││ │ (SHA-256) │ │ (RSA) │ │ (DH/ECDH) │ ││ └─────────────┘ └─────────────┘ └─────────────┘ ││ ┌─────────────────────────────────────────────────────────┐ ││ │ CIPHER加密器 │ ││ │ 执行加密/解密运算的具体工具 │ ││ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ ││ │ │ AES │ │ DES │ │ RSA │ │ ││ │ └──────────┘ └──────────┘ └──────────┘ │ ││ └─────────────────────────────────────────────────────────┘ ││ ││ PASSWORD口令 ││ 用户输入的认证凭据 ││ 如“mySecret123”、“hello123” ││ ↓ 通过KDF派生 ││ SecretKey ││ ↓ 交给Cipher ││ 加密/解密 │└─────────────────────────────────────────────────────────────────┘回到顶部五、常见误区与最佳实践误区一把Password直接当密钥用// ❌ 错误String password “123456”;Cipher cipher Cipher.getInstance(“AES”);cipher.init(Cipher.ENCRYPT_MODE, password); // 类型不匹配正确做法使用PBKDF2、bcrypt等KDF将Password派生为密钥。误区二使用ECB模式// ❌ 不安全ECB模式下相同明文产生相同密文Cipher.getInstance(“AES/ECB/PKCS5Padding”);正确做法使用GCM推荐或CBC模式。误区三重复使用IVGCM模式下重复使用IV会引发伪造攻击。每次加密都应生成新的随机IV。最佳实践清单Cipher使用AES/GCM/NoPadding256位密钥IV每次加密生成新的随机IVGCM使用12字节Password存储使用bcrypt或Argon2加盐哈希绝不存储明文Password → 密钥使用PBKDF2WithHmacSHA256迭代次数≥10000密钥管理密钥不得硬编码在代码中应使用密钥管理服务KMS回到顶部六、总结概念 一句话定义 在Java中的体现Crypto 密码学的总称/领域 javax.crypto包Cipher 执行加解密的具体工具 javax.crypto.Cipher类Password 用户身份认证的凭据 String / char[]需加盐哈希存储
Codex AI表单生成实战:20分钟快速开发USM自定义表单 在实际企业开发中,表单处理是每个开发者都会遇到的场景。特别是当业务需要快速创建和部署自定义表单时,手动编写每个表单的HTML、验证逻辑和提交处理会消耗大量时间。Codex作为AI辅助开发工具,能够显著提升这类重复性工作的效率。项目标题中提… 2026/7/11 21:56:45
hil仿真平台应该具备能力才能满足控制算法的充分验证。 概述:要充分验证包含运动学、动力学、几何模型的控制算法,覆盖其全部功能与性能指标,HIL(硬件在环)仿真平台需要从模型保真度、实时硬件能力、工况覆盖、故障注入、性能量化、自动化测试、几何空间验证、合规可追溯八大… 2026/7/11 21:56:45
UE5 UpdateOverlaps六大误用场景解析与最佳实践 1. 项目概述:为什么我们需要关注UpdateOverlaps?在虚幻引擎5(UE5)的项目开发中,尤其是涉及到物理交互、角色移动、触发器响应时,UpdateOverlaps这个函数就像房间里的大象——它至关重要,却又常常… 2026/7/11 21:54:45
企业微信机器人 vs 应用消息推送:5大核心差异与选型指南 企业微信机器人 vs 应用消息推送:5大核心差异与选型指南在企业数字化协作场景中,消息推送机制的选择直接影响信息触达效率。当技术决策者面对企业微信提供的两种主流方案——群机器人与应用消息推送时,往往陷入选择困境。本文将深入剖析两者的… 2026/7/11 23:21:02
从模糊草图到商业级成图:1个原始PNG触发17种专业输出模式——Midjourney图生图工业级管线拆解 更多请点击: https://intelliparadigm.com 第一章:从模糊草图到商业级成图:1个原始PNG触发17种专业输出模式——Midjourney图生图工业级管线拆解 在工业级AI视觉生产中,一张低分辨率手绘草图(如800600 PNG࿰… 2026/7/11 23:17:01
GPTs不是玩具:金融/医疗/法务三大强监管领域已落地的5个合规认证GPTs(含HIPAA/GDPR适配说明) 更多请点击: https://intelliparadigm.com 第一章:GPTs不是玩具:强监管领域落地的范式跃迁 在金融、医疗、政务等强监管领域,GPTs正从“演示型助手”蜕变为“可审计、可追溯、可问责”的生产级系统组件。其核心价值不在于生成能… 2026/7/11 23:15:01
A选矿厂---金属平衡计算 ——基于红土镍矿选矿-湿法冶炼联合流程的三产品金属平衡 一、基础设计参数 1.1 选矿工艺流程 红土镍矿原矿 ↓ 原矿过磅计量(汽车衡/皮带秤) ↓ 原矿水分测定 → 计算干矿量 ↓ 破碎筛分 ↓ 强磁选别 ├──→ 强磁铁精矿&#… 2026/7/11 23:13:00
AI赋能在线考试——麦塔从智能组卷到学情分析的全链条变革 一、AI正在重塑在线考试2025年,麦塔在线考试系统接入AI大模型能力,标志着在线考试行业进入AI驱动的新阶段。AI的应用正在从“辅助”走向“核心”,覆盖从组卷到学情分析的全链条。这场变革的意义不亚于从纸笔考试到线上考试的跃迁——如果说在… 2026/7/11 23:13:00
一站式RGB灯光统一控制:OpenRGB如何终结多品牌软件混乱 一站式RGB灯光统一控制:OpenRGB如何终结多品牌软件混乱 【免费下载链接】OpenRGB Open source RGB lighting control that doesnt depend on manufacturer software. Supports Windows, Linux, MacOS. Mirror of https://gitlab.com/CalcProgrammer1/OpenRGB. Relea… 2026/7/11 23:13:00
5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 [特殊字符] 5分钟搞定Kodi字幕难题:智能字幕插件让你追剧无忧 🎬 【免费下载链接】zimuku_for_kodi Kodi 插件,用于从「字幕库」网站下载字幕 项目地址: https://gitcode.com/gh_mirrors/zi/zimuku_for_kodi 还记得那个深夜吗?你刚下载… 2026/7/11 0:00:11
工业信号干扰处理与FOD4216光耦应用实战 1. 工业环境中的信号干扰挑战在工业自动化领域,信号采集的准确性直接关系到整个控制系统的可靠性。典型的工业现场充斥着各种干扰源:大功率电机启停产生的电磁干扰、变频器工作产生的高频噪声、继电器触点火花放电,以及长距离传输引入的共模干… 2026/7/11 0:00:11
OpenHarmony 完整项目工程整合规范 + 模块化分层架构(API23+ 标准企业级结构) 摘要前面系列教程覆盖了 ArkUI 组件、路由、生命周期、本地存储、网络请求、Ability 底层全套基础能力,本篇统一梳理标准工程目录分层、模块化拆分、代码复用规范、全局工具统一管理、项目打包权限配置、常见工程报错统一解决方案,形成可直接用于课程设计… 2026/7/11 0:00:11
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/11 14:53:30
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/11 12:30:52
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/11 15:29:59