JavaWeb大文件上传:敏感数据流式加密与信封密钥管理
看到这个标题我脑子里先冒出来的是某次在银行类JavaWeb项目里被大文件上传“放倒”的场景客户经理传了一个40多MB的客户资料压缩包后端用byte[]一口气读进内存Tomcat 直接内存溢出页面咔一下白屏。后来问题修好了但真正让我后背发凉的是那个压缩包里几乎全是身份证、银行卡、手机号这类客户敏感信息。如果当时的处理方式是先落明文再想办法加密那这就不是一次普通的性能事故而是一次实打实的数据安全事件。这个标题其实拆成三个问题来答比较省力JavaWeb 层怎么接住大文件上传在上传链路里怎么对敏感客户数据做加密银行这种安全等级要求极高的场景下加密不能只是“有”还要经得起安全审计和密钥轮换。这篇就按这三层往下展开读完你既可以拿到能落地的算法和代码也能避开我踩过的那些坑。1. 先拆解需求到底哪些敏感数据、躲在哪一层1.1 大文件里的敏感数据远不止“身份证号”一个字段很多人一看到“敏感客户数据”第一反应是数据库里那几列身份证号、手机号、银行卡号。但在大文件上传这个场景里问题要麻烦得多。客户经理传上来的往往是一个贷款资料包、一份征信报告PDF、一组合同扫描件甚至是一个几十MB的Excel台账里面的敏感信息是以整个文件为载体的。我接触过的典型场景是信贷审批系统客户提交的资产证明、收入流水、房产证复印件全部打包压缩压缩包轻松上50MB。这种文件里没有任何“字段”概念——你不能像处理数据表一样把某个单元格抠出来单独加密。文件名本身也可能泄露信息比如一个文件直接叫“张三_139xxxx8888_结婚证.pdf”这种情况下如果只加密文件内容不处理文件名等于把客户隐私贴在门牌上。所以大文件上传的加密核心对象是整个文件实体外加文件名等元数据。字段级加密只能用在文件落库之后的结构化数据上两者是两条平行线不能混为一谈。1.2 银行场景的加密底线不只是HTTPS而是落盘即密文银行类系统过安全评审的时候内部安全团队必问几个问题文件落到磁盘上是什么形态如果数据库或者文件服务器被拖走别人能不能直接读出客户内容备份磁带丢了能不能还原出明文密钥存在哪里、多久轮换一次这些问题背后的底线是一致的传输过程要可靠存储状态必须是密文密钥和文件要分离。很多研发习惯性以为“我上了HTTPS就加密了”这是完全不够的。HTTPS解决的是数据在网络传输中被窃听的问题它到服务器接入层就终止了。从网关到应用、从应用到磁盘这条路上的数据在业务层仍然是明文。对于银行级系统业务层面的落盘加密不是可选项而是默认项。这一点想清楚之后后续所有设计才有了基调我们不能先接收明文文件、再额外包一层加密任务而要在接收文件的那一刻就用密文形态写盘。1.3 先排雷那些“以为加密了其实没加密”的典型错误动手之前先把我在各种项目里见过的反面教材列出来省得后面再踩对文件名做MD5/SHA内容却明文存储。文件一打开什么隐私都在里面等于脱了裤子防色狼。使用DES、3DES、ECB模式。算法早已过时ECB模式下相同的明文块会生成相同的密文块文件特征根本藏不住。全系统共用一个固定密钥还硬编码在代码或者配置文件里。密钥一旦泄露所有客户数据全部裸奔。先把整个文件读进byte[]再做加解密。几十MB文件直接干爆堆内存属于大文件处理最常见的死法。把密文转成Base64存数据库。Base64会让体积膨胀约33%大文件场景下磁盘和查询成本同时失控。这些坑不是理论上的是真的一家家踩过来的。理解了这些问题下面选型时的很多取舍就顺理成章了。2. 加密选型为什么大文件场景默认走AES-GCM和信封加密2.1 AES-GCM vs AES-CBC vs SM4模式选择背后的安全逻辑对称加密算法本身可选范围不大银行场景常见的是AES和国密SM4。真正让研发犯难的是分组模式的选择。下表是三个常用选项的对比维度AES-CBCAES-GCMSM4-GCM是否支持完整性校验不支持需另拼HMAC原生支持AEAD原生支持AEAD加密数据是否可篡改检测无法直接感知解密时自动校验解密时自动校验并行处理友好度一般有限计数器状态连续有限常用场景传统磁盘加密大文件、网络传输、敏感数据落盘有国密合规要求时性能有AES-NI时较快较快取决于实现CBC模式只解决了“加密”问题不解决“防篡改”问题。在大文件场景里文件可能被中间人替换、被截断、被篡改如果没有完整性校验密文被偷偷改掉一部分解密出来的文件可能是一个逻辑错误的文件系统却完全察觉不到。AES-GCM是AEAD模式加密过程中会生成一个认证标签解密时如果数据被改动任何一个字节直接抛出认证失败异常。这个特性对银行文件来说太重要了因为客户资料的完整性和机密性同等重要。我个人的倾向是没有国密合规约束直接上AES-256-GCM有国密要求就用SM4-GCM配套的国密算法体系。性能方面现代CPU基本都支持AES-NI指令集1MB缓冲区下加密吞吐量能到几百MB/s对常见的大文件上传影响完全可以接受。2.2 文件级加密和字段级加密要配合使用有人会问文件里面全是身份证号码能不能只加密这些号码其他内容保持明文这样处理起来效率高理论上可以但实践上行不通。PDF、图片、Office文档这些格式内部是高度结构化的二进制布局。你想在已经写入磁盘的文件里定位到某个字符串并做原位加密要么破坏文件结构要么需要极其复杂的解析逻辑。银行系统里的文件来自五花八门的业务系统你做字段级模糊替换做一次坏一次。所以我的建议是两条腿走路结构化入库数据如数据库里的客户手机号、账户余额等走字段级加密在DAO层用AES-GCM加解密每个字段随机IV。非结构化文件PDF、图片、压缩包、视频等走文件级整体加密文件无论多大从接收开始就整体密文落盘。这两套体系可以共用同一个密钥管理服务但算法参数、密钥维度、元数据模型建议分开建避免一张表里既存字段密文又存文件密文运维混乱。2.3 信封加密密钥轮换的工程命门密钥管理是银行系统里最容易让方案翻车的环节。很多项目用一把固定密钥加密所有文件看起来简单但安全审计一查“密钥轮换方案”就直接卡死如果你要轮换主密钥难道把所有历史文件全部重新解密再加密几十TB的文件重加密一遍这是不可接受的工程量。所以必须引入信封加密模型系统只保留一把或少数几把主密钥KEK由KMS、HSM或独立密钥服务器保管。每上传一个文件随机生成一把数据密钥DEK用这把DEK加密文件内容。再用主密钥KEK加密DEK得到的DEK密文存储在数据库元数据表里。使用时先用KEK解出DEK再用DEK解开文件。打个比方主密钥是保险柜的主钥匙每份文件有一把自己独立的柜门钥匙。你要取文件先用主钥匙打开保险柜取出这份文件的柜门钥匙再去开文件柜。这样单个文件密钥泄露不会波及其他文件主密钥轮换时只需要把存量DEK密文重新用新主密钥加密一遍文件本体完全不用动。这个模型不是可选项。银行审计问“你怎么做密钥轮换”时没有信封加密几乎没法回答。3. 上传链路设计如何做到明文不落盘还能兼容分片和断点续传3.1 明文的生命周期传输层、应用层、存储层三层视角设计上传链路时我会把“明文”当作一种危险物质凡是能减少它出现时间的地方都要减少。一条完整链路通常是这样客户端发起HTTPS请求到接入层Nginx/网关TLS终止这个环节解决传输加密请求进入Java后端后通过MultipartFile的输入流读取分片内容在应用层我们不把分片内容缓存在内存数组而是马上交给CipherOutputStream加密后直接写入磁盘临时文件或对象存储。这个链路的关键点在Web容器配置。很多项目死在默认配置上Tomcat的maxPostSize默认2MB、maxSwallowSize默认也是2MB大文件上传直接报错。要支持大文件必须把这两个参数调大并且用分片而不是一次性POST整个文件。另一方面MultipartResolver解析时如果文件被暂存到了临时目录默认是明文暂存。这里要特别检查配置确保上传组件不会在应用层把明文写到临时目录否则后面的加密就是白做。我的建议是在后端验收时加一条“线上扫描”规则用文件监控工具查看应用临时目录上传期间不允许出现明文客户文件。3.2 分片上传和GCM状态机如何共存大文件上传通常要分片否则单次请求体积太大网络抖动就全盘重传。但分片和AES-GCM有一个天然的矛盾GCM是带有状态的分组模式计数器必须连续不允许中间重置。如果每个分片在服务端独立初始化一个Cipher再加密最后拼接起来会导致IV或计数器重复使用这在密码学上是致命的——两个分片使用相同密钥和相同IV计数器起点时密文会泄露明文信息。实际工程里可以这么做方案一全局加密流顺序写入。前端仍然把文件切成10MB的分片逐片POST到后端。后端为这个文件维护一个唯一的CipherOutputStream各分片达到服务端后按顺序追加写入同一个加密流。这样整体文件的加密状态是连续的GCM的计数器从头到尾不重置。这个方案适合文件不是特别大比如2GB以内、上传并发量可控的场景。实现上要注意同一文件的分片必须串行写入除非用锁保证顺序否则一个分片乱序就会导致整个加密流崩溃。方案二分片独立密钥独立加密。每个分片单独生成一把DEK和IV独立加密后存储。元数据表记录每个分片的DEK密文、IV、序号、哈希。下载时按序号把密文分片取出来分别解密再拼接。这个方案支持并发分片上传和更好的断点续传坏处是元数据复杂且无法防止分片被重排或替换需要额外用哈希链把分片串起来。除非文件超大且网络条件极差否则我一般不建议上方案二。我的建议是绝大多数银行业务文件都在几十MB到几百MB量级直接选方案一。实现简单、安全性好、审计也好解释。3.3 元数据设计密文文件旁边要跟着一份“开锁说明书”文件加密之后解密需要的信息不能丢否则密文永远躺死在硬盘上。一套完整的文件元数据表至少包含以下字段字段说明file_id全局唯一文件IDuser_id_hash归属客户或客户经理的哈希值用于权限隔离file_name_cipher原始文件名的加密值绝不存明文iv文件加密时使用的随机IVdek_cipher用KEK加密后的DEK密文key_version加密该DEK时使用的主密钥版本alg算法标识如AES/GCM/NoPaddingtotal_size明文文件总大小sha256明文文件哈希用于完整性双重校验upload_status上传中/已完成/已失效为什么要存key_version因为主密钥轮换之后旧文件必须知道自己是被哪一版主密钥包裹的。如果代码里永远用“当前最新密钥”去解DEK以前的老文件全都会解密失败。这是我在生产环境里见过最经典的运维事故。file_name_cipher也要存密文。原始文件名里经常带着客户姓名、手机号、证件号日志和数据库一旦把明文的文件名打出来客户隐私就泄了一半。下载时再解密还原文件名只在响应头Content-Disposition里短暂使用。4. 核心代码实现加密服务、分片上传和密钥管理一次讲完4.1 加密服务封装流式加解密的核心写法文件加密最忌讳的就是“一次性读入内存”。核心代码应当基于CipherInputStream和CipherOutputStream做流式处理缓冲区建议1MB比8KB的默认缓冲性能好很多。public static void encryptFile(InputStream in, OutputStream out, SecretKey key, byte[] iv) throws Exception { Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(128, iv)); try (CipherOutputStream cos new CipherOutputStream(out, cipher)) { byte[] buffer new byte[1024 * 1024]; int len; while ((len in.read(buffer)) ! -1) { cos.write(buffer, 0, len); } } }对应的解密方法就是把Cipher初始化为DECRYPT_MODE然后用CipherInputStream包装密文输入流。注意一个细节CipherOutputStream.close()会触发认证标签的生成所以一定要用try-with-resources确保关闭否则最后一段数据的加密标签丢失解密时必然失败。4.2 分片上传控制层按序写入同一个加密流方案一的核心是把每个分片的输入流追加到同一个加密输出流。代码逻辑大致如下// 统一管理每个文件的加密输出流注意单实例时用 ConcurrentHashMap private final ConcurrentHashMapString, CipherOutputStream encryptStreams new ConcurrentHashMap(); PostMapping(/upload/chunk) public Result uploadChunk(RequestParam(fileId) String fileId, RequestParam(index) int index, RequestParam(chunk) MultipartFile chunk) throws Exception { // 1. 校验当前上传文件的状态 FileMeta meta fileMetaService.get(fileId); if (meta null || meta.getUploadStatus() ! PROCESSING) { throw new IllegalStateException(文件状态异常请重新创建上传任务); } // 2. 校验分片序号必须严格连续 synchronized (fileId.intern()) { if (meta.getCurrentChunk() ! index) { throw new IOException(分片序号不连续请从 meta.getCurrentChunk() 重传); } // 3. 首次上传时初始化加密流 CipherOutputStream cos encryptStreams.computeIfAbsent(fileId, k - { try { // 从信封加密中拿到DEK和IV SecretKey dek kmsService.decryptDek(meta.getDekCipher()); Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); cipher.init(Cipher.ENCRYPT_MODE, dek, new GCMParameterSpec(128, meta.getIv())); return new CipherOutputStream(new FileOutputStream(meta.getEncryptedFile()), cipher); } catch (Exception e) { throw new RuntimeException(e); } }); // 4. 直接写入注意不要调用 cos.close() try (InputStream in chunk.getInputStream()) { byte[] buffer new byte[1024 * 1024]; int len; while ((len in.read(buffer)) ! -1) { cos.write(buffer, 0, len); } } // 5. 更新当前进度 meta.setCurrentChunk(index 1); } return Result.ok(meta.getProgress()); }这段代码有几个地方容易踩坑分片写入时不能关闭CipherOutputStream一关整个文件的加密流就断了每次分片上传之后分片的InputStream要自己关闭但加密流要留到所有分片传完再关闭。对于多实例部署这种本地ConcurrentHashMap的做法会有问题建议要么用Redis锁保证同一个文件的写操作路由到同一实例要么直接用方案二的分片独立加密。4.3 密钥管理生成DEK、加密DEK、解密DEK的标准流程信封加密的实现重点是把“数据密钥”和“主密钥”分开。以下代码展示核心步骤// 1. 为每个文件生成随机DEK public static SecretKey generateDataKey() throws Exception { KeyGenerator generator KeyGenerator.getInstance(AES); generator.init(256); return generator.generateKey(); } // 2. 用主密钥KEK加密DEK得到DEK密文 public static byte[] encryptDek(SecretKey dek, SecretKey kek, byte[] kekIv) throws Exception { Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); cipher.init(Cipher.ENCRYPT_MODE, kek, new GCMParameterSpec(128, kekIv)); return cipher.doFinal(dek.getEncoded()); } // 3. 用主密钥KEK解密DEK密文恢复数据密钥 public static SecretKey decryptDek(byte[] dekCipher, SecretKey kek, byte[] kekIv) throws Exception { Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); cipher.init(Cipher.DECRYPT_MODE, kek, new GCMParameterSpec(128, kekIv)); byte[] dekBytes cipher.doFinal(dekCipher); return new SecretKeySpec(dekBytes, AES); }生产环境里KEK本身不该出现在应用代码里更不该出现在配置文件。理想方案是从KMS服务的本地接口读取或者对接加密机。如果项目预算和运维能力有限至少要做到KEK存储在环境变量或独立配置中心与代码仓库分离并且有定期的轮换任务。轮换时只需要遍历文件元数据表用新KEK重新加密每个DEK即可文件本体不需要动。4.4 下载与完整性校验解密时怎么确认文件没被改下载是一个反方向的过程核心是用CipherInputStream包裹密文输入流边读边解密边写响应输出流。这里有一个容易被忽略的点GCM的完整性校验发生在读取流到达末尾的时候。也就是说只有读完整个文件认证标签才会被验证。如果文件被截断、篡改或者密钥不对会在流结束时抛出AEADBadTagException。GetMapping(/download/{fileId}) public void download(PathVariable(fileId) String fileId, HttpServletResponse response) throws Exception { FileMeta meta fileMetaService.get(fileId); SecretKey dek kmsService.decryptDek(meta.getDekCipher()); response.setHeader(Content-Disposition, attachment; filename*UTF-8 URLEncoder.encode(kmsService.decryptFileName(meta), UTF-8)); Cipher cipher Cipher.getInstance(AES/GCM/NoPadding); cipher.init(Cipher.DECRYPT_MODE, dek, new GCMParameterSpec(128, meta.getIv())); try (InputStream fin new FileInputStream(meta.getEncryptedFile()); CipherInputStream cis new CipherInputStream(fin, cipher); OutputStream out response.getOutputStream()) { byte[] buffer new byte[1024 * 1024]; int len; while ((len cis.read(buffer)) ! -1) { out.write(buffer, 0, len); } } catch (AEADBadTagException e) { // 认证失败说明文件被篡改或密钥有问题 throw new IllegalArgumentException(文件完整性校验失败); } }如果安全要求更高加密时把明文文件的SHA-256算出来存到元数据表下载解密完成后重新计算SHA-256比对。GCM标签已经能防篡改但多加一层明文的哈希可以防止密码算法之外的边界情况比如密钥被暴力破解后的二次验证。5. 常见故障排查加密上传最容易出问题的几个点5.1 高频问题速查表症状可能原因解决方案上传过程中OutOfMemoryError一次性readAllBytes()、缓冲太小全部改为流式读取缓冲区设1MB检查JVM堆上传很慢、CPU飙升加密缓冲区太小、未启用AES-NI把缓冲区提到1MB确认JDK支持硬件加速解密报AEADBadTagExceptionIV或DEK不匹配、密文被截断、分片乱序写入核对fileId对应的IV/DEK检查分片序号所有分片传完文件解密打不开CipherOutputStream被提前关闭确保最后一个分片写完后才关闭加密流数据库里DEK字段报错或被截断列类型varchar长度不够用VAR_BINARY/BLOB或用Base64存满46字符多个并发线程写同一文件加密流导致异常并发写同一个CipherOutputStream按fileId加锁保证串行写入重启后文件解密失败加密流状态没写入元数据重启前必须关闭加密流并把进度持久化5.2 安全审计视角下容易翻车的细节安全审计不是只盯算法很多项目死在细节上。这里列几条我实际经历过的日志脱敏。上传接口的日志千万不要记录文件名、文件内容前几行的明文。日志里只保留fileId、分片序号、文件大小、当前状态这类无敏感信息字段。否则加密做得再好日志一泄全完。备份策略。密文文件和密钥绝不能放在同一个备份介质里。备份文件可以只备份密文密钥要单独走密钥管理系统的备份通道。现实中很多项目密文和密钥放在同一个NAS目录这等于什么都没做。密钥版本兼容。代码里解密DEK的时候必须先读元数据里的key_version再选择对应版本的主密钥去解。如果你永远用“当前最新的KEK”去解所有的DEK轮换一次就崩一次。临时文件权限。即便密文落盘也不能把临时文件丢到任何人可读的共享目录。文件系统的权限控制要和数据库同级对待加密是最后一道保险不是唯一的保险。6. 项目里的实操体会与可以继续扩展的方向6.1 我踩过坑之后总结出来的三条经验第一安全方案的设计一定要从“密钥轮换”倒推回来。我见过不少团队一开始用固定密钥做文件加密上线半年后安全部门要求轮换密钥结果发现所有存量文件都无法解密只能停机重来。信封加密不是锦上添花是给未来留后路。第二大文件加密的性能问题绝大多数不是算法太慢而是工程写法太差。缓冲区设成8KB和设成1MB同样一个100MB文件耗时可能差出几倍用byte[]读整个文件和用流式读取内存占用能差出几十倍。先把代码写法改对再看算法本身。第三加密这件事要做到“全链路覆盖”否则等于没做。文件内容加密了文件名明文数据库字段加密了日志明文传输加密了临时盘明文。审计的人不看你用了多强的算法他们看的是明文在系统里出现过多少次。明文出现的环节越少方案越安全。6.2 可以继续扩展的方向这套方案在后面还能往几个方向演进。一个是支持国密SM4-GCM用于满足金融合规要求里的商密算法场景另一个是大文件场景下的密文去重借助哈希判断两个文件内容是否相同相同内容只存一份密文节省银行昂贵的存储成本再一个是加密与对象存储的配合把密文文件直接推到对象存储桶元数据放在数据库密钥留在KMS这样存储层扩容对安全模型完全透明。最后再说个很实在的事从我接触过的项目看银行这类高安全场景的研发最稀缺的不是密码学知识而是把密码学正确落到工程里的意识。流有没有关、状态有没有并发竞争、密钥有没有硬编码、日志有没有打明文这些不起眼的地方反而决定了整个方案能不能过审、能不能稳定运行。

相关新闻

Claude、CodeX配置使用技巧:在Vscode与Pycharm中统一TaoToken API通道

Claude、CodeX配置使用技巧:在Vscode与Pycharm中统一TaoToken API通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 5:19:39 阅读更多 →
纯静态HTML个人网页模板:结构拆解与二次开发实战指南

纯静态HTML个人网页模板:结构拆解与二次开发实战指南

简介:这份资源面向正在准备网页设计期末大作业的大学生与网页制作初学者,提供多套可直接参考的静态个人网页、个人博客与网站模板,帮助解决作业数量多、无从下手、找不到合适模板等常见困扰。压缩包共4261个文件,约142.4MB&#x…

2026/10/18 5:19:39 阅读更多 →
Xcode 27 AI Agent 实测:Claude、ChatGPT、Gemini 三模型在 IDE 里的分工与切换

Xcode 27 AI Agent 实测:Claude、ChatGPT、Gemini 三模型在 IDE 里的分工与切换

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 5:19:39 阅读更多 →

最新新闻

SSM智慧医院门诊管理系统源码解析:从环境搭建到二次开发

SSM智慧医院门诊管理系统源码解析:从环境搭建到二次开发

简介:这是一套基于SSM框架的Java智慧医院门诊管理系统完整项目源码,面向计算机相关专业的课程设计与毕业设计人群,也适合想通过真实项目巩固Java Web开发技能的进阶学习者。系统覆盖注册登录、挂号、就诊、缴费、药品管理与信息管理等门诊核心…

2026/10/18 22:09:28 阅读更多 →
Flutter适配OpenHarmony实战:逆向思维App与学习日历实现

Flutter适配OpenHarmony实战:逆向思维App与学习日历实现

去年下半年我接了一个挺纠结的任务:把一个逆向思维训练 App 跑上 OpenHarmony 设备。项目本身并不复杂,但“既要保证训练体验,又要尽快适应新的系统生态”这个条件,一下把工作量拉高了不少。我当时的反应跟大部分人一样&#xff0…

2026/10/18 22:09:28 阅读更多 →
中缀转后缀与前缀:栈的应用及易错点解析

中缀转后缀与前缀:栈的应用及易错点解析

1. 从一道25分题说起:表达式转换到底在考什么表达式转换是数据结构与算法课程里非常经典的一类题目,通常出现在栈与队列这一章。很多人第一次看到“中缀转后缀”或者“中缀转前缀”的时候,会觉得这不就是个格式变换吗,有什么难的。…

2026/10/18 22:09:28 阅读更多 →
Codex Skin Studio 主题定制指南:把 Codex auth.json 改到 TaoToken 的完整配置

Codex Skin Studio 主题定制指南:把 Codex auth.json 改到 TaoToken 的完整配置

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 22:09:28 阅读更多 →
告别“精神分裂”!给 Cursor 也装上 Memory Bank,节省包月请求,提高代码一致性

告别“精神分裂”!给 Cursor 也装上 Memory Bank,节省包月请求,提高代码一致性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 22:09:28 阅读更多 →
SwiftUI NavigationView实战:导航栈、NavigationLink与迁移NavigationStack指南

SwiftUI NavigationView实战:导航栈、NavigationLink与迁移NavigationStack指南

接手老项目的时候,第一眼看到几十个NavigationView躺在代码里,我心里咯噔一下:iOS 16 之后苹果不是已经推荐NavigationStack了吗,怎么还在用老的容器?后来真动手改了一遍才发现,这些NavigationView并不是偷…

2026/10/18 22:08:28 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →