- 1.Elcomsoft 取证系列: Elcomsoft Forensic Disk Decryptor 磁盘解密工具
- 2.“脑机接口”频频上新 离日常生活还有多远
- 3.不吹不擂,提升你对BeanValidation数据校验的认知
- 4.实例分析,轻松掌握声控照明电路
1.Elcomsoft 取证系列: Elcomsoft Forensic Disk Decryptor 磁盘解密工具
天津鸿萌科贸发展有限公司是 ElcomSoft 系列软件的授权代理商。
Elcomsoft Forensic Disk Decryptor 软件支持即时访问存储在加密的 BitLocker、FileVault 2、PGP Disk、TrueCrypt 和 VeraCrypt 磁盘和容器中的数据。该工具从 RAM 镜像、休眠和页面文件中提取加密密钥,或使用纯文本密码或托管密钥来解密存储在加密容器中的文件和文件夹,或将加密卷挂载为新的驱动器号,以便即时、实时访问。
- 解密 BitLocker、BitLocker To Go、FileVault 2、PGP 磁盘、TrueCrypt 和 VeraCrypt 卷和容器
- 从 RAM 镜像、休眠和页面文件、托管和恢复密钥中提取加密密钥
- 快速、无痕迹的操作
- 即时将加密容器挂载为驱动器号
- 使用内核级工具捕获计算机易失性内存的内容
- 从 TrueCrypt、VeraCrypt、BitLocker、FileVault、PGP 磁盘和 LUKS/LUKS2 加密磁盘、Jetico BestCrypt 磁盘和容器中提取加密元数据
支持:BitLocker(包括 TPM 配置)、FileVault 2(包括 APFS 卷)、LUKS、PGP 磁盘、TrueCrypt 和 VeraCrypt 加密容器和全磁盘加密、BitLocker To Go、XTS-AES BitLocker 加密、Jetico BestCrypt、RAM 转储、休眠文件、页面文件
新功能
指定 TrueCrypt/VeraCrypt 的加密和哈希算法
TrueCrypt 和 VeraCrypt 允许用户更改加密算法以及用于从密码生成加密密钥的哈希函数。此信息永远不会存储在加密容器中的任何位置。如果专家指定了错误的算法,即使尝试了正确的密码,恢复密码的尝试也会失败。此版本添加了在从 TrueCrypt/VeraCrypt 卷捕获加密元数据时指定暴力破解密码算法的功能。
LUKS2 加密
我们添加了对 LUKS2 加密的支持。该工具可以从加密的磁盘和容器中提取 LUKS2 元数据。
用于访问加密卷的完全集成解决方案
Elcomsoft Forensic Disk Decryptor 提供了一系列方法来访问存储在加密的 BitLocker、FileVault 2、LUKS、LUKS2、PGP Disk、TrueCrypt 和 VeraCrypt 磁盘和卷以及 Jetico BestCrypt 9 容器中的信息。该工具包允许使用卷的纯文本密码、托管或恢复密钥,以及从计算机的内存镜像或休眠文件中提取的二进制密钥。FileVault 2恢复密钥可以使用 Elcomsoft Phone Breaker 从 iCloud 中提取,而 BitLocker 恢复密钥可在 Active Directory 或用户的 Microsoft 帐户中使用。
如果加密密钥和恢复密钥都无法提取,本软件可以从加密容器中提取元数据,让 Elcomsoft Distributed Password Recovery 完成其工作。
提取加密元数据
如果需要访问原始明文密码才能访问数据,则需要从加密磁盘中提取加密元数据。Forensic Disk Decryptor 将立即从受 TrueCrypt、VeraCrypt、BitLocker、FileVault、PGP Disk、LUKS/LUKS2 和 Jetico BestCrypt 磁盘和容器保护的加密硬盘驱动器、加密容器和取证磁盘镜像中提取加密元数据。生成的小文件包含使用 Elcomsoft Distributed Password Recovery 发起 GPU 加速分布式攻击所需的一切。
完全解密,即时挂载或攻击
通过对加密卷和加密设置的全自动检测,专家只需提供加密容器或磁盘镜像的路径。Elcomsoft Forensic Disk Decryptor 将自动搜索、识别和显示加密卷及其相应加密设置的详细信息。
通过解密加密卷的全部内容或在未锁定的未加密模式下将卷装载为驱动器号来提供访问。这两种操作都可以将卷作为附加磁盘(物理或逻辑)或原始镜像来完成;对于 FileVault 2、PGP 磁盘和 BitLocker,可以使用恢复密钥(如果可用)执行解密和装载。
完全解密
Elcomsoft Forensic Disk Decryptor 可以自动解密加密容器的全部内容,使调查人员能够完全、不受限制地访问存储在加密卷上的所有信息
实时访问加密信息
在实时模式下,Elcomsoft Forensic Disk Decryptor 将加密卷作为新的驱动器号挂载到调查人员的 PC 上。在这种模式下,取证专家可以快速、实时地访问受保护的信息。从挂载的磁盘和卷中读取的信息将实时解密。
没有解密密钥,也没有恢复密钥?
如果解密密钥和恢复密钥都不可用,Elcomsoft Forensic Disk Decryptor 将提取必要的元数据,以便使用 Elcomsoft Distributed Password Recovery 暴力破解密码。
Elcomsoft Distributed Password Recovery 可以通过一系列高级攻击来攻击保护加密容器的纯文本密码,包括字典、掩码和排列攻击以及暴力攻击。
加密密钥的来源
Elcomsoft Forensic Disk Decryptor 需要原始加密密钥才能访问存储在加密容器中的受保护信息。可以从挂载加密卷时获取的休眠文件或内存转储文件中提取加密密钥。有三种方法可以获取原始加密密钥:
- 通过分析休眠文件(如果正在分析的 PC 已关闭);
- 通过分析内存转储文件。可以使用内置的内存镜像工具获取正在运行的 PC 的内存转储。
- 通过执行 FireWire 攻击(被分析的 PC 必须运行并装载了加密卷)。需要在调查员的 PC 上启动的免费工具才能执行 FireWire 攻击(例如 Inception)。
- 通过使用内置 RAM 镜像工具捕获内存转储
FileVault 2、PGP 磁盘和 BitLocker 卷可以使用托管密钥(恢复密钥)进行解密或装载。
2.“脑机接口”频频上新 离日常生活还有多远
神工-神行系统。天津大学供图
北脑二号。北京脑科学与类脑研究所供图
当人工智能还在不断挑战人们对未来科技发展的想象力,当元宇宙概念持续火热、引领科技新潮时,脑机接口技术正逐渐从实验室走向市场,产业化进程不断加速,有望成为连接现实与虚拟世界的关键桥梁。
6月20日,2024世界智能产业博览会在天津开幕,会议期间,脑-机接口未来产业创新发展主题活动举行。这场活动不仅集中发布了多项脑机接口领域的创新成果,还邀请了百余名政企学研代表,围绕加速脑机接口技术多场景商业落地展开讨论。
其中,天津大学、脑机交互与人机共融海河实验室、中国电子等单位,集中发布了“云脑”医学大模型、“片上脑-机接口”智能交互系统以及“神工-神行”混合驱动虚拟现实步行系统等多项脑机接口领域阶段性成果。
“脑机接口”技术成果频频上新,离日常生活应用还有多远?假肢控制、记忆改善、神经系统疾病治疗、虚拟现实游戏……不久后的一天,人们或将面临一个全新交互方式的未来。
或将取代手机
脑机接口技术是在大脑与外部设备之间创建信息通道,通过采集和解码中枢神经活动进行意图识别和输出,操控外部装置并接收反馈信息,构成闭环的人机交互系统。目前,该技术主要应用于人体机能障碍的补偿与修复,以及人类行为能力的增强。
尽管当前这项技术大多处于实验研究阶段,其临床应用缺乏系统性的验证,然而,对其未来发展的无限可能,已经存在于业内人士的认知中。就在前不久,埃隆·马斯克高仿号“Not Elon Musk”发文称:“你会在你的大脑上安装一个Neuralink(意为神经连接)接口,让你通过思考来控制你的新X手机吗?”
埃隆·马斯克本人对此的回应是,“未来将不会再有手机,只有Neuralink。”
Neuralink是由埃隆·马斯克创立的公司,专门研究脑机接口技术。今年1月,马斯克的脑机接口公司进行了首次大脑芯片植入试验,利用电流让电脑和脑细胞互联,实现“人机交互”。据当地媒体报道,美国食品药品监督管理局已批准了Neuralink公司将其大脑芯片植入第二位受试者脑内的申请,这项试验在6月进行。目前已经有1000多名四肢瘫痪的患者愿意接受Neuralink的试验,该公司计划,到2030年将为超过2.2万人植入芯片。
取代手机?植入越来越多的人类大脑?这不禁让人思考,脑机接口技术是否将引领人们走向一个前所未有的未来?
“脑机交互技术属于生物与信息融合领域的人机交互新模式,涵盖了医学、数学、物理、化学、计算机、电子、机械、材料、信息等多学科领域专业知识,具有跨学科深度交叉融合的鲜明特色。”天津大学医学工程与转化医学研究院副院长许敏鹏对中青报·中青网记者说。
由天津大学副校长明东教授带领的神经工程团队,是目前国内最先从事脑机接口领域研究的团队之一,长期探索脑机接口技术在不同场景中的应用可能性。截至目前,该团队研发了神经调控式机械外骨骼系统“神工-神甲”和可穿戴式脑控外肢体手指机器人系统“神工-灵犀指”,后者首次实现了脑控与外肢体机器人系统的可穿戴集成,可为肢体运动与感知功能的补充和增强提供新途径;团队研发的混合驱动外骨骼+虚拟现实步行康复系统“神工-神行”,正是这次世界智能产业博览会发布的重要成果之一。该成果搭建虚拟现实沉浸式多康复应用场景,正在多家三甲医院开展百例级临床验证实验。
在4月26日举行的2024中关村论坛年会“脑机接口创新发展与应用论坛”上,明东也在主旨报告中提到,用于检测大脑状态和功能的被动式脑机接口,将在高性能人机系统中得到广泛应用。
“伴随高通量脑机接口技术的成熟,真正的Cyber-man(赛博人),或将成为现实。”明东说。据了解,“赛博人”这一概念,是指生命体与非生命体有机融合的智能形态,它的出现将使得人与机器人的边界逐渐模糊。
脑机接口技术是否会成为解锁人类潜能的新钥匙?许敏鹏认为,脑机接口技术存在潜力和可能性,但同时也伴随着许多复杂的问题和挑战。
“脑机接口技术确实为我们提供了一种全新的方式,来探索和利用大脑的功能。通过直接与大脑进行通信,我们有可能解锁之前无法触及的人类潜能,包括提高记忆力、学习能力、运动能力、情绪管理能力等。这种技术也有望为神经系统疾病患者提供新的治疗方法,存在为普通人提供超越生物极限的可能性。”许敏鹏说。
成果频频上新
随着科学家对脑机交互技术的不断探索与应用转化,“赛博人”或许正在从一个概念走向现实。
正如天津大学校长、中国工程院院士金东寒在世界智能产业博览会上所说的那样,当前,脑机交互技术正在推动神经工程、智能医学、生物医学等交叉学科的重大理论、技术和应用创新,“这将有助于营造更具活力的脑机接口创新业态”。
在基础元件领域,有脑机接口编解码专用芯片“脑语者”;在航空航天领域,有包括世界首套在轨脑-机交互操作系统平台在内的设备,已经陆续在神舟十一号、神舟十八号等实现应用;在康复医疗领域,有用于全肢体中风康复的“纯意念控制”人工神经机器人系统“神工-神机”;在神经重症领域,神经重症脑积水精确客观诊疗系统“神工-神篙”,能将诊断时间从3天缩减为30分钟……
许敏鹏告诉记者,团队在脑机接口领域的创新技术,将推动人机交互方式由“显性行为交互”到“隐性意念交互”的变革,促进脑机接口技术在临床康复、航天医学及相关领域的产业化进程,提高我国脑机接口领域研究的全球竞争力,助力新一代脑机智能交互技术的快速发展。
近年来,国内外脑机接口领域的最新研究进展接连发布,产业界也在加快推进该技术的临床应用和产业化。2023年10月,全球首例无线微创脑机接口临床试验在北京宣武医院成功实施,为一名因车祸造成的四肢瘫痪患者实现了自主喝水等脑控功能;浙江大学、复旦大学、中国科学院深圳先进技术研究院等,也在该领域取得了重要的科研成果。
在2024中关村论坛年会上发布的“北脑二号”智能脑机系统,是这一领域的重要成果之一。据了解,北京脑科学与类脑研究所联合北京芯智达神经技术有限公司,成功构建“北脑二号”高性能侵入式智能脑机系统。其自主研发的高通量柔性微丝电极、大通道数高速神经电信号采集设备,能有效支撑高效运动想象神经编解码的开发。另外,“北脑二号”在国际上首次实现猕猴对二维运动光标的灵巧脑控——这一突破,为更自然、更灵活的新一代神经假肢的开发等临床应用奠定了基础。
“脑机技术的发展亟待一个更为高级且全面的设计规划。具体而言,我们需要深入考量如何有效地整合资源,实现科研、产业界、临床实践与监管机构之间的全面协同与融合。这一规划需从全局出发,统筹兼顾,确保各方资源得到优化配置,从而推动脑机接口技术的持续创新与进步。”北京脑科学与类脑研究所所长罗敏敏对中青报·中青网记者说。
在脑机接口创新发展与应用论坛上,脑机接口产业联盟发布了《2024脑机接口产业创新十大案例》,应用场景包括情绪的检测与评估、辅助睡眠、脑创伤患者的治疗与康复训练等。天津大学神经工程团队参与的“神工”系列成果也在其中。
“交叉学科协同创新将加速脑机接口等技术形成‘新质生产力’,有助于促进产业升级和社会发展,对医疗、教育、娱乐、军事等多个领域产生深远影响,为社会带来更多的福祉。”许敏鹏说。
他同时也提到,脑机接口技术带来了一系列伦理、法律和社会问题。
“如果这种技术被用于提高智力或体能,那么社会不平等可能会加剧。此外,我们还必须考虑如何保护个人的隐私和自由,避免技术被滥用或误用。最后,技术本身也面临着许多挑战。例如如何确保脑机接口的安全性和稳定性,如何避免对大脑造成损害,以及如何解决现有技术瓶颈等。”许敏鹏说。
临床研究有了共识
在许敏鹏看来,技术发展的同时,要充分考虑并解决伦理、法律和社会问题,确保技术的安全和公正使用,只有这样,才能充分发挥脑机接口技术的潜力,推动人类社会进步。
“在开展研究前,研究者必须提交详细的伦理审查申请,确保研究符合伦理标准和规定。在研究过程中,研究者应严格遵守伦理准则,尊重受试者的知情权和选择权,并采取一切必要措施,确保受试者在研究过程中的安全,包括严格的手术操作、设备监测和应急处理方案。在研究结束后,研究者应对受试者进行长期的随访和评估,确保他们的健康和权益得到持续地关注和保护。”许敏鹏详细向记者解释。
他还提到,受试者的个人信息和实验数据也应得到严格保护,“防止任何形式的泄漏和滥用”。研究者也要保持科学研究的严谨性,确保实验设计合理、数据收集准确、分析过程严谨,并对实验结果进行客观、公正的解读,并避免任何形式的学术不端行为。
作为一项在大脑与外部设备之间建立连接的新型交叉技术,脑机接口既是国际上竞相发展的科技前沿技术,与此同时,也是让研究者与大众都不得不谨慎对待的技术。
“对待脑机接口技术,一方面要有政府监管,保证伦理保证安全,另一方面也需要保证开创性和一定的灵活度。任何突破性的疗法,最担心的是被滥用,因此,严格的监管是必要的。在监管之下,要鼓励创新。”罗敏敏对中青报·中青网记者说。
2024年年初,由清华大学医学院教授洪波团队和首都医科大学宣武医院院长赵国光、主任医师单永治团队合作的全球首例无线微创脑机接口临床试验成果发布。脑机接口创新发展与应用论坛期间,赵国光在谈到脑机接口诊疗面临的挑战时,列出了“侵入性与安全伦理及隐私问题”。
在论坛上,神经外科医学家、中国科学院院士赵继宗发布了《神经系统疾病脑机接口临床研究实施与管理的中国专家共识》。他提到,2024年3月,中华医学会神经外科分会在年会期间组织了50余名神经外科医生,进行了关于中国脑机接口临床医学研究共识的讨论。形成共识,一是为了让研究者能够“更好地投入我国脑机接口整个研发中”,二是为了保护病人的利益,使临床研究最后落地这部分能够“更加安全科学,保证研究全过程正常实施”。
共识提出“不伤害、尊重自主、隐私保护、透明公开、公平公正的伦理原则”,以促进脑机接口临床研究“符合伦理规范”;共识还专门提到,“临床研究应确保的主要目标为患者功能改善,而非正常人群的功能增强”。
“这在推动我国脑机接口的临床应用,特别是植入型脑机接口技术的临床应用方面,将发挥重要的作用。”赵继宗说。
正如工业和信息化部党组成员谢远生在“脑机接口创新发展与应用论坛”致辞中所说,随着脑机接口技术的不断“上新”,要健全脑机接口法制监管体系,坚持促进创新与防范风险相统一,完善多方参与、协同控制、高效互动的治理模式。从制度建设、标准规范、立法研究等方面,健全完善行业统一政策,在保证技术进一步发展的同时,加强统一监管和伦理指引,确保脑机接口技术的安全应用。
“希望大家以此为契机,进一步加深脑机接口领域的国内外交流合作,共同推动产业健康发展,实现共治共享共赢。”谢远生说。(张渺)
来源:中国青年报
3.不吹不擂,提升你对BeanValidation数据校验的认知
作 者: BAT的乌托邦
原文链接:https://mp.weixin.qq.com/s/g04HMhrjbvbPn1Mb9JYa5g
作为一个开发者,聊起数据校验(Bean Validation),不管是前、中、后端都耳熟能详,并且心里暗爽:so easy。
的确,对数据做校验是一个程序员的基本素质,它不难但发生在我们程序的几乎每个角落,就像下面这幅图所示:「每一层都需要做校验」。
如果你真的这么去写代码的话(每一层都写一份),肯定是不太合适的,良好的状态应该如下图所示:
作为一个Java开发者,在Spring大行其道的今天,很多小伙伴了解数据校验来自于Spring MVC场景,甚至「止步于此」。殊不知,Java EE早已把它抽象成了JSR标准技术,并且Spring还是借助整合它完成了自我救赎呢。
在我看来,按「Spring的3C战略」标准来比,Bean Validation数据校验这块是没有能够完成对传统Java EE的超越,自身设计存在过重、过度设计等特点。
本专栏命名为Bean Validation(数据校验),将先从JSR标准开始,再逐渐深入到具体实现Hibernate Validation、整合Spring使用场景等等。因此本专栏将让你将得到一份系统数据校验的知识。
✍正文
「在任何时候」,当你要处理一个应用程序的业务逻辑,数据校验是你必须要考虑和面对的事情。应用程序必须通过「某种手段」来确保输入进来的数据从语义上来讲是正确的,比如生日必须是过去时,年龄必须>0等等。
为什么要有数据校验?
数据校验是非常常见的工作,在日常的开发中贯穿于代码的「各个层次」,从上层的View层到后端业务处理层,甚至底层的数据层。
我们知道通常情况下程序肯定是分层的,不同的层可能由不同的人来开发或者调用。若你是一个有经验的程序员,我相信你肯定见过在「不同的层面都出现了相同的校验代码」,这就是某种意义上的「垃圾代码」:
public String queryValueByKey(String zhName, String enName, Integer age) { checkNotNull(zhName, "zhName must be not null"); checkNotNull(enName, "enName must be not null"); checkNotNull(age, "age must be not null"); validAge(age, "age must be positive"); ... }
从这个简单的方法入参校验至少能发现如下问题:
- 需要写大量的代码来进行参数基本验证(这种代码多了就算垃圾代码)
- 需要通过文字注释来知道每个入参的约束是什么(否则别人咋看得懂)
- 每个程序员做参数验证的方式可能不一样,参数验证抛出的异常也不一样,导致后期几乎没法维护
如上会导致代码冗余和一些管理的问题(代码量越大,管理起来维护起来就越困难),比如说语义的一致性问题。为了避免这样的情况发生,最好是将「验证逻辑与相应的域模型进行绑定」,这就是本文将要提供的一个新思路:Bean Validation。
关于Jakarta EE
2018年03月, Oracle 决定把 JavaEE 移交给开源组织 「Eclipse 基金会」,并且不再使用Java EE这个名称。这是它的新logo:
对应的名称修改还包括:
旧名称新名称「Java EE」Jakarta EE「Glassfish」Eclipse Glassfish「Java Community Process (JCP)」Eclipse EE.next Working Group (EE.next)「Oracle development management」Eclipse Enterprise for Java (EE4J) 和 Project Management Committee (PMC)
JCP 将继续支持 Java SE社区。但是,「Jakarta EE规范自此将不会在JCP下开发」。Jakarta EE标准大概由Eclipse Glassfish、Apache TomEE、Wildfly、Oracle WebLogic、JBoss、IBM、Websphere Liberty等组织来制定
迁移
既然名字都改了,那接下来就是迁移喽,毕竟Java EE这个名称(javax包名)不能再用了嘛。Eclipse接手后发布的首个Enterprise Java将是 Jakarta EE 9,该版本将以Java EE 8作为其基准版本(最低版本要求是Java8)。
有个意思的现象是:Java EE 8是2019.09.10发布的,但实际上官方名称是Jakarta EE 8了。很明显该版本并非由新组织设计和制定的,不是它们的产物。但是,彼时平台已更名为Jakarta有几个月了,因此对于一些Jar你在maven市场上经常能看见两种坐标:
javax.validation validation-api 2.0.1.Final jakarta.validation jakarta.validation-api 2.0.1 虽然坐标不一样,但是「内容是100%一样的」(包名均还为javax.*),很明显这是更名的过渡期,为后期全面更名做准备呢。
❝
严格来讲:只要大版本号(第一个数字)还一样,包名是「不可能」变化的,因此一般来说均具有向下兼容性
❞
既然Jakarta释放出了更名信号,那么下一步就是彻彻底底的改变喽。果不其然,这些都在Jakarta EE 9里得到实施。
Jakarta EE 9
「2020.08.31」,Jakarta后的第一个企业级平台Jakarta EE 9正式发布。如果说Jakarta EE 8只是冠了个名,那么这个就名正言顺了。
❝
小贴士:我写本文时还没到2020.08.31呢,这个时间是我在官网趴来的,因此肯定准确
❞
这次企业平台的升级最大的亮点是:
- 把旗下30余种技术的「大版本号」全部+1(Jakarta RESTful Web Services除外)
- 包名「全部」去javax.*化,全部改为jakarta.*
- JavaSE基准版本要求依旧保持为Java 8(而并非Java9哦)
可以发现本次升级的主要目的并着眼于功能点,仍旧是名字的替换。虽然大家对Java EE的javax有较深的情节,但旧的不去新的不来。我们以后开发过中遇到jakarta.*这种包名就不用再感到惊讶了,提前准备总是好的。
Jakarta Bean Validation
Jakarta Bean Validation不仅仅是一个规范,它还是一个生态。
之前名为Java Bean Validation,2018年03月之后就得改名叫Jakarta Bean Validation 喽,这不官网早已这么称呼了:
Bean Validation技术隶属于Java EE规范,期间有多个JSR(Java Specification Requests)支持,截止到稿前共有三次JSR标准发布:
说明:JCP这个组织就是来定义Java标准的,在Java行业鼎鼎有名的公司大都是JCP的成员,可以共同参与Java标准的制定,影响着世界。包括掌门人Oracle以及Eclipse、Redhat、JetBrains等等。值得天朝人自豪的是:2018年5月17日「阿里巴巴作为一员正式加入JCP组织,成为唯一一家中国公司」。
Bean Validation是标准,它的参考实现除了有我们熟悉的Hibernate Validator外还有Apache BVal,但是后者使用非常小众,忘了它吧。实际使用中,基本可以认为Hibernate Validator是Bean Validation规范的唯一参考实现,是对等的。
❝
小贴士:Apache BVal胜在轻量级上,只有不到1m空间所以非常轻量,有些选手还是钟爱的(此项目还在发展中,并未停更哦,有兴趣你可以自己使用试试)
❞
JSR303
这个JSR提出很早了(2009年),它为 「基于注解的」 JavaBean验证定义元数据模型和API,通过使用XML验证描述符覆盖和扩展元数据。JSR-303主要是对JavaBean进行验证,如方法级别(方法参数/返回值)、依赖注入等的验证是没有指定的。
作为开山之作,它规定了Java数据校验的模型和API,「这就是Java Bean Validation 1.0版本」。
javax.validation validation-api 1.0.0.GA 该版本提供了常见的校验注解(共计13个):
注解支持类型含义null值是否校验@AssertFalsebool元素必须是false否@AssertTruebool元素必须是true否@DecimalMaxNumber的子类型(浮点数除外)以及String元素必须是一个数字,且值必须<=最大值否@DecimalMin同上元素必须是一个数字,且值必须>=最大值否@Max同上同上否@Min同上同上否@Digits同上元素构成是否合法(整数部分和小数部分)否@Future时间类型(包括JSR310)元素必须为一个「将来」(不包含相等)的日期(比较精确到毫秒)否@Past同上元素必须为一个「过去」(不包含相等)的日期(比较精确到毫秒)否@NotNullany元素不能为null是@Nullany元素必须为null是@Pattern字符串元素需符合指定的正则表达式否@SizeString/Collection/Map/Array元素「大小」需在指定范围中否
❝
所有注解均可标注在:方法、字段、注解、构造器、入参等几乎任何地方
❞
可以看到这些注解均为平时开发中比较常用的注解,但是在使用过程中有如下事项你仍旧需要注意:
- 「以上所有注解对null是免疫的」,也就是说如果你的值是null,是不会触发对应的校验逻辑的(也就说null是合法的),当然喽@NotNull / @Null除外
- 对于时间类型的校验注解(@Future/@Past),是开区间(不包含相等)。也就是说:如果相等就是不合法的,必须是大于或者小于
- 这种case比较容易出现在LocalDate这种只有日期上面,必须是将来/过去日期,「当天属于非法日期」
- @Digits它并不规定数字的范围,只规定了数字的结构。如:整数位最多多少位,小数位最多多少位
- @Size规定了集合类型的范围(包括字符串),这个范围是「闭区间」
- @DecimalMax和@Max作用基本类似,大部分情况下可通用。不同点在于:@DecimalMax设置最大值是用字符串形式表示(只要合法都行,比如科学计数法),而@Max最大值设置是个long值
- 我个人一般用@Max即可,因为够用了~
另外可能有人会问:为毛没看见@NotEmpty、@Email、@Positive等常用注解?那么带着兴趣和疑问,继续往下看吧~
JSR349
该规范是2013年完成的,伴随着Java EE 7一起发布,它就是我们比较熟悉的Bean Validation 1.1。
javax.validation validation-api 1.1.0.Final 相较于1.0版本,它主要的改进/优化有如下几点:
- 标准化了Java平台的约束定义、描述、和验证
- 「支持方法级验证(入参或返回值的验证)」
- Bean验证组件的依赖注入
- 与上下文和DI依赖注入集成
- 使用「EL表达式」的错误消息插值,让错误消息动态化起来(强依赖于ElManager)
- 跨参数验证。比如密码和验证密码必须相同
❝
小贴士:注解个数上,相较于1.0版本并没新增~
❞
它的官方参考实现如下:
可以看到,Java Bean Validation 1.1版本实现对应的是Hibernate Validator 5.x(1.0版本对应的是4.x)
org.hibernate hibernate-validator 5.4.3.Final 当你导入了hibernate-validator后,无需再显示导入javax.validation。hibernate-validator 5.x版本基本已停更,只有严重bug才会修复。因此若非特殊情况,不再建议你使用此版本,也就是不建议再使用Bean Validation 1.1版本,更别谈1.0版本喽。
❝
小贴士:Spring Boot1.5.x默认集成的还是Bean Validation 1.1哦,但到了Boot 2.x后就彻底摒弃了老旧版本
❞
JSR380
当下主流版本,也就是我们所说的「Java Bean Validation 2.0」和「Jakarta Bean Validation 2.0」版本。关于这两种版本的差异,官方做出了解释:
他俩除了叫法不一样、除了GAV上有变化,其它地方没任何改变。它们各自的GAV如下:
javax.validation validation-api 2.0.1.Final jakarta.validation jakarta.validation-api 2.0.1 现在应该不能再叫Java EE了,而应该是Jakarta EE。两者是一样的意思,你懂的。Jakarta Bean Validation 2.0是在2019年8月发布的,属于Jakarta EE 8的一部分。它的官方参考实现只有唯一的Hibernate validator了:
此版本具有很重要的现实意义,它主要提供如下亮点:
- 支持通过注解参数化类型(泛型类型)参数来验证容器内的元素,如:List<@Positive Integer> positiveNumbers
- 更灵活的集合类型级联验证;例如,现在可以验证映射的值和键,如:Map<@Valid CustomerType, @Valid Customer> customersByType
- 支持java.util.Optional类型,并且支持通过插入额外的值提取器来支持自定义容器类型
- 让@Past/@Future注解支持注解在JSR310时间上
- 新增内建的注解类型(共9个):@Email, @NotEmpty, @NotBlank, @Positive, @PositiveOrZero, @Negative, @NegativeOrZero, @PastOrPresent和@FutureOrPresent
- 所有内置的约束现在都支持「重复标记」
- 使用反射检索参数名称,也就是入参名,详见这个API:ParameterNameProvider
- 很明显这是需要Java 8的启动参数支持的
- Bean验证XML描述符的名称空间已更改为:
- META-INF/validation.xml -> http://xmlns.jcp.org/xml/ns/validation/configuration
- mapping files -> http://xmlns.jcp.org/xml/ns/validation/mapping
- JDK最低版本要求:JDK 8
Hibernate Validator自6.x版本开始对JSR 380规范提供完整支持,除了支持标准外,自己也做了相应的优化,比如性能改进、减少内存占用等等,因此用最新的版本肯定是没错的,毕竟只会越来越好嘛。
新增注解
相较于1.x版本,2.0版本在其基础上新增了9个实用注解,总数到了22个。现对新增的9个注解解释如下:
注解支持类型含义null值是否校验@Email字符串元素必须为电子邮箱地址否@NotEmpty容器类型集合的Size必须大于0「是」@NotBlank字符串字符串必须包含至少一个非空白的字符「是」@Positive数字类型元素必须为正数(不包括0)否@PositiveOrZero同上同上(包括0)否@Negative同上元素必须为负数(不包括0)否@NegativeOrZero同上同上(包括0)否@PastOrPresent时间类型在@Past基础上包括相等否@FutureOrPresent时间类型在@Futrue基础上包括相等否
像@Email、@NotEmpty、@NotBlank之前是Hibernate额外提供的,2.0标准后hibernate自动「退位让贤」并且标注为过期了。Bean Validation 2.0的JSR规范制定负责人就职于Hibernate,所以这么做就很自然了。就是他:
❝
小贴士:除了JSR标准提供的这22个注解外,Hibernate Validator还提供了一些非常实用的注解,这在后面讲述Hibernate Validator时再解释吧
❞
使用示例
导入实现包:
org.hibernate.validator hibernate-validator 6.1.5.Final 校验Java Bean
书写JavaBean和校验程序(全部使用JSR标准API哦):
@ToString @Setter @Getter public class Person { @NotNull public String name; @NotNull @Min(0) public Integer age; }
public static void main(String[] args) { Person person = new Person(); person.setAge(-1); // 1、使用【默认配置】得到一个校验工厂 这个配置可以来自于provider、SPI提供 ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); // 2、得到一个校验器 Validator validator = validatorFactory.getValidator(); // 3、校验Java Bean(解析注解) 返回校验结果 Set
> result = validator.validate(person); // 输出校验结果 result.stream().map(v -> v.getPropertyPath() + " " + v.getMessage() + ": " + v.getInvalidValue()).forEach(System.out::println); } 运行程序,不幸抛错:
Caused by: java.lang.ClassNotFoundException: javax.el.ELManager at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:418) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:355) ...
上面说了,从1.1版本起就需要El管理器支持用于错误消息动态插值,因此需要自己额外导入EL的实现。
❝
小贴士:EL也属于Java EE标准技术,可认为是一种表达式语言工具,它并不仅仅是只能用于Web(即使你绝大部分情况下都是用于web的jsp里),可以用于任意地方(类比Spring的SpEL)
❞
这是EL技术规范的API:
javax.el javax.el-api 3.0.0 Expression Language 3.0表达式语言规范发版于2013-4-29发布的,Tomcat 8、Jetty 9、GlasshFish 4都已经支持「实现」了EL 3.0,因此随意导入一个都可(如果你是web环境,根本就不用自己手动导入这玩意了)。
org.apache.tomcat.embed tomcat-embed-el 9.0.22 添加好后,再次运行程序,控制台正常输出校验失败的消息:
age 最小不能小于0: -1 name 不能为null: null
校验方法/校验构造器
请移步下文详解。
加餐:Bean Validation 3.0
伴随着Jakarta EE 9的发布,Jakarta Bean Validation 3.0也正式公诸于世。
jakarta.validation jakarta.validation-api 3.0.0 它最大的改变,甚至可以说「唯一」的改变就是包名的变化:
至此不仅GAV上实现了更名,对代码执行有重要影响的包名也彻彻底底的去javax.*化了。因为实际的类并没有改变,因此仍旧可以认为它是JSR380的实现(虽然不再由JCP组织制定标准了)。
参考实现
毫无疑问,参考实现那必然是Hibernate Validator。它的步伐也跟得非常的紧,推出了7.x版本用于支持Jakarta Bean Validation 3.0。虽然是大版本号的升级,但是在新特性方面你可认为是「无」:
✍总结
本文着眼于讲解「JSR规范、Bean Validation校验标准、官方参考实现Hibernate Validator」,把它们之间的关系进行了关联,并且对差异进行了鉴别。我认为这篇文章对一般读者来说是能够刷新对数据校验的认知的。
❝
wow,数据校验背后还有这么广阔的天地
❞
数据校验是日常工作中接触非常非常频繁的一块知识点,我认为掌握它并且熟练运用于实际工作中,能起到事半功倍的效果,让代码更加的优雅,甚至还能实现别人加班你加薪呢。「所以又是一个投出产出比颇高的小而美专栏在路上......」
4.实例分析,轻松掌握声控照明电路
楼道路灯需控制,手动开关不方便。
智能开关很多种,声光控制最常见。
触摸开关更聪明,延时熄灯节约电。
开关串联火线上,安装使用都方便。
传统照明电路工作都需要使用机械开关,靠人工控制,有时使用起来极为不便。电子信息技术发展的主要目标是实现高度智能化,在减少乃至不需要人为干预的条件下使机器能独立处理各种工作。曾经不被人们所重用的声音、光等,如今在电子信息技术方面都得到了广泛的应用,尤其是光能更是有待人们开发的巨大的能源宝库。智能化照明电路也是如此,如我们所熟知的楼道照明电路的智能化实现方法是综合利用了声学-光学-电子学原理,而马路上的路灯则是应用了光学的原理。
声控照明电路——声音控制触发器,灯亮灯熄很默契
声控照明电路主要利用了声学和电子学的原理,即用声音传感器将声音信号转换成电信号,从而推动触发器触发使电路导通工作。智能化声控照明电路应具有以下功能。
① 能在声音的控制下实现电路的导通与截止。
② 能够接收的声音应是多方面的,如脚步声、物体打击声等。
③ 响应时间应越短越好。在选择电路元器件时,应选择灵敏度较高的声音传感器组成声控照明电路中控制电路的前端,同时还要为该传感器设置传感条件,如声音响度必须在20dB 以上才能响应等。中间部分采用触发器构成,利用触发器不触不发、一触即发的特点去推动照明电路工作。触发器也应选择灵敏度高、响应时间短的,如 D 触发器、JK 触发器等。
④ 声控、光控与延时电路相结合,可有效节省电能资源。
1.声控延时门灯电路
图1-21所示为以音乐集成电路作为声控元件同时兼有延时作用的声控延时门灯电路,将它安装在室内门框边,能在夜晚有人敲门或进出门时点亮门灯。
该电路属于声控、光控与延时功能相结合的电路,这一技术在目前短时间使用的照明灯电路中应用得比较广泛,如楼道灯、门厅灯。控制部分采用全分立元件制作,成本低,应用效果好。
(1)稳压电路
220V交流电经C1、R1、VD1、VD2、ZD1和C2组成的电容降压、稳压电路供给控制电路。R2、ZD2构成3V稳压电路,给音乐集成电路提供供电电压。
(2)声音发出电路
本电路采用音乐集成电路 KD9300作为声源,每触发一次便自动演奏一首乐曲,其演奏速度由外接振荡电阻R3来决定。演奏时间的长短由R3的阻值决定,增大R3的阻值时,演奏时间会延长。
(3)声音控制电路
当压电片 HTD 受到一定强度的声音振动时,能将音频信号转换成电信号。该信号加在KD9300的触发端,其③脚有+1V左右的直流电压输出,使VT1饱和导通。这样12V电压几乎全部加在了电位器RP两端。从RP的滑动端取出一定的电压送到由VT2等组成的开关电路中,VT2导通,继电器K吸合而点亮门灯。
(4)白天亮灯控制电路
RG是光敏电阻,接在VT2的基极与发射极之间,用以控制开关管VT2。当白天有光照时,RG 的阻值很小,VT2 的基极与发射极间的电压较小,VT2 始终截止。白天或者室内光照较强时,不管是否有人敲门,KD9300是否有信号输出,继电器均不会得电,门灯不亮;到了夜晚光敏电阻 RG 的阻值增大,当 KD9300 受声控触发而输出直流电压时,VT1导通,经RP、R4、RG分压,VT2的基极和发射极间电压超过0.7V,VT2导通,K吸合。它的一组常开触点 K-1 点亮了门灯,另一组转换触点 K-2 断开了 RG,点亮了发光二极管VD3。这样一方面可使VT2的饱和程度更深,另一方面使开关电路不受门灯光照的影响。经数分钟延时,KD9300复位,其③脚无电压输出,VT1、VT2均截止,门灯熄灭,电路恢复初始状态。
(5)手动控制电路
图中S是原门灯用的开关,保留该开关,以备不时之需。
提示
该电路中的继电器损坏后,可用有两组触点的继电器代换。
2.声控节能灯电路(一)
由两只晶闸管构成的声控节能灯电路如图 1-22 所示。该电路主要以单向晶闸管 VS1 和VS2、受话器MIC、照明灯EL为核心构成。
该电路由声音控制电路和手动控制电路两大部分组成。任一支路形成通路时,均会使灯泡EL点亮。
(1)手动控制电路
SA1为手动控制开关,当将SA1置于闭合位置时,灯泡EL点亮,同时也使声音控制电路进入工作状态,整流电路VD1~VD4通电,VS2被触发导通。当将SA1置于断开位置时, VD1~VD4 形成的交流通路可使灯泡EL仍保持点亮状态。这时,随着C3 充电的完成,晶闸管VS2的控制极电流逐渐减小,经过一段时间以后,晶闸管截止,灯泡会自动熄灭。
(2)声控控制电路
VD1~VD4组成桥式整流电路,R2和R6组成分压电路。从分压电路中取出31V左右的电压并通过VD5加到晶闸管VS1的阳极,同时R2输出的电压还经R1为受话器供电。当灯泡熄灭以后,电容C3已经充好电,该电压约为44V。
当有拍手声或讲话声时,声波被受话器MIC接收后,在受话器MIC的输出端便出现了一系列脉冲,第一个正脉冲便可使VS1导通。C3通过R3和导通的晶闸管VS1进行放电,放电电流使晶闸管VS1仍保持着导通状态,持续时间约为10s。
经过电阻R6、VD5和晶闸管VS1的是正弦脉动直流电流,可以将VS2触发导通,灯泡EL仍保持点亮。VD6因电容C3上的电压极性与它反向而截止,所以,此时电容C3不能充电。当电容 C3 的放电电流减小到不能维持晶闸管 VS1 导通时,VS1 截止。此后,电容 C3重新开始经电阻R6、VD6和VS2的控制极充电,晶闸管VS2仍保持导通状态,直至充电电流减小到不能触发晶闸管VS2时为止。
提示
电容C2为耦合电容。当受话器回路出现开路故障时,稳压管VD7用于限制落到电容 C1 上的过电压。受话器可采用任意型号的电容式受话器。
调整电位器RP的阻值,可以改变声音控制电路的接收灵敏度,当将其阻值调整到47kΩ时,在距受话器的1m左右范围内拍手时灯泡即可点亮;但其阻值低于10kΩ时灵敏度下降,且触发会受到影响。
3.声控节能灯电路(二)
图1-23所示为由集成电路LM386构成的声控节能灯电路。
该电路中使用了两个集成电路。音频功率放大器IC1(LM386)用于放大压电陶瓷片HTD拾取的声波信号;IC2和IC3各为双D触发器CD4013中的一个D触发器,IC2组成单稳态电路,IC3组成分频器电路。
220V交流电经变压器T降压、VD1~VD4桥式整流、电容C1滤波后得到+7V电压,为控制电路提供工作电源。压电陶瓷片 HTD 拾取的击掌声等声波信号加至 IC1 的③脚,放大后的信号从IC1的⑤脚输出,经C3耦合加到IC2的⑥脚。
IC2组成的单稳态电路对从⑥脚输入的声音信号进行整形,单稳态时间由R1和C4的参数确定。每击掌一次,IC2的①脚只有一个稳定的高电平脉冲输出,该信号直接加到IC3的11脚。
IC3 组成的分频器电路可进行双稳态输出。当其11脚输入第一个脉冲信号时,13脚输出高电平,使晶体管VT1饱和导通,继电器KAJ的线圈得电,其动合触点KAJ1闭合,使灯泡ELl点亮。
当IC3的11脚输入第二个脉冲信号时,其13脚输出变为低电平。该信号经R2加到VT1的基极,使VT1截止,继电器KAJ的线圈失电,其动合触点KAJ1断开,灯泡EL1熄灭。
当IC3的11脚输入第三个脉冲信号时,其13脚再次输出高电平,灯泡EL1再次点亮。
上述过程如此循环。也就是说,每击一次掌,有一次冲击声波时,灯泡EL1就点亮或熄灭一次,从而达到了用声音控制照明灯的目的。
提示
在电压陶瓷片HTD上加助声腔后效果会更好。晶体管VT1可选用9013,二极管可选用 1N7。该电路对阻容元件及工作电压无严格要求,只要安装正确,无须调试即可投入使用,声控距离可达5~6m。
本网站的文章部分内容可能来源于网络和网友发布,仅供大家学习与参考,如有侵权,请联系站长进行删除处理,不代表本网站立场,转载者并注明出处:https://www.jmbhsh.com/xingyeremen/5063.html