电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java 如何實現AES加密

瀏覽:4日期:2022-08-22 08:22:56

做360廣告的對接需要對密碼進行AES加密,下面是點睛平臺文檔的描述:

(AES模式為CBC,加密算法MCRYPT_RIJNDAEL_128)對MD5加密后的密碼實現對稱加密。秘鑰是apiSecret 的前16位,向量是后16位,加密結果為64位數字和小寫字母。

用Java實現AES需要依賴Java加密擴展(The Java Cryptography Extension,簡稱JCE)的支持——主要是在javax下面的一些包。根據描述需要使用的算法為“AES/CBC/NoPadding”,實現方案如下:

public static String encode1(String src, String secretKey, String initialVector)throws Exception {Key key = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), 'AES');AlgorithmParameterSpec spec = new IvParameterSpec(initialVector.getBytes(StandardCharsets.UTF_8));Cipher cipher = Cipher.getInstance('AES/CBC/NoPadding'); cipher.init(Cipher.ENCRYPT_MODE, key, spec);byte[] encrypted = cipher.doFinal(src.getBytes());return Hex.encodeHexString(encrypted);}

這里使用的 SecretKeySpec、 AlgorithmParameterSpec、 IvParameterSpec等類都是JCE提供的,通常在JVM環境下可以直接使用。 Hex.encodeHexString()方法則是由apache-commons-codec提供的。如果不想多引入一個依賴也可以使用下面的方法:

public static String toHexString(byte[] bytes) {StringBuilder builder = new StringBuilder();for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(0xFF & bytes[i]);if (hex.length() < 2) {builder.append(0);}builder.append(hex);}return builder.toString();}

下面是為這個加密方法寫的單元測試:

@Testpublic void encode1() throws Exception {String src = 'http://www.hdgsjgj.cn/bcjs/098f6bcd4621d373cade4e832627b4f6';String key = '1234567891234567';String iv = '8912345678912345'; String result = AES.encode1(src, key, iv);String expect = '21fa89586f4a299545307b99036a082e135b52d3f63f93541e4291669a0de1de';Assert.assertEquals(expect, result);}

這里的代碼大體上能夠滿足360廣告的對接需求了。但是因為jdk11偶爾對一些javax擴展包的不支持,我有些不太喜歡這個方案。另外在一些資料中也了解到jdk對AES 256加密是有一些限制的,要響應相關限制需要引入一個授權文件或者更換jdk,這就有些難接受了。種種原因吧,我需要一個替換方案。

最開始我以為在apache-common-codec中會有相關方案,但是結果是讓人失望的。不過還好,最終我找到了Bouncy Castle。以下是關于Bouncy Castle的一些描述:

Bouncy Castle 是一種用于Java平臺的開放源碼的輕量級密碼算法包。它支持大量的密碼算法,并提供 JCE 1.2.1 的實現。Bouncy Castle是輕量級的,從J2SE 1.4到J2ME(包括MIDP)平臺,它都可以運行。它是在MIDP上運行的唯一完整的密碼術包。

使用Bouncy Castle提供的能力必然需要先引入相關的依賴。針對不同的jdk版本,Bouncy Castle都有提供對應的Cryptography Provider。比如我使用的是JDK1.8,對應的就是bcprov-jdk15to18,相關的依賴如下:

<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15to18</artifactId> <version>1.66</version></dependency>

基于Bouncy Castle實現的360點睛平臺AES加密處理如下:

public static String encode2(String value, String secretKey, String initialVector) {try {BufferedBlockCipher cipher = getCipher(secretKey, initialVector);byte[] bytes = value.getBytes(StandardCharsets.UTF_8);byte[] out = new byte[cipher.getOutputSize(bytes.length)];int len = cipher.processBytes(bytes, 0, bytes.length, out, 0);len += cipher.doFinal(out, len);byte[] arr = new byte[len];System.arraycopy(out, 0, arr, 0, len);return Hex.toHexString(arr);} catch (Exception e) {throw new EncryptException('Data encryption failed. ' + e.getMessage());}} private static BufferedBlockCipher getCipher(String secretKey, String iniVector) {try {byte[] iv = iniVector.getBytes(StandardCharsets.UTF_8);CipherParameters params = new ParametersWithIV(new KeyParameter(secretKey.getBytes(StandardCharsets.UTF_8)), iv);BufferedBlockCipher cipher = new BufferedBlockCipher(new CBCBlockCipher(new AESEngine()));cipher.init(true, params);return cipher;} catch (Exception ex) {throw new EncryptException('Cannot intialize Bouncy Castle cipher. ' + ex.getMessage());}}

因為360點睛平臺要求使用的加密key沒有超過256位,所以兩個方案都是行得通的。

我比較喜歡Bouncy Castle這個方案,這個方案相對較輕量,并且不依賴JCE。但是這個方案的不足之處也恰恰在于此:Java中的SSL層,JSSE和XML加密庫都依賴到JCE,而且AES Key長度的校驗是在 Cipher類中進行的,在這些場景下Bouncy Castle也很難起到作用。

以上就是Java 如何實現AES加密的詳細內容,更多關于Java 實現AES加密的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 无缝钢管-聊城无缝钢管-小口径无缝钢管-大口径无缝钢管 - 聊城宽达钢管有限公司 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 北京模型公司-军事模型-工业模型制作-北京百艺模型沙盘公司 | 螺纹三通快插接头-弯通快插接头-宁波舜驰气动科技有限公司 | 浙江红酒库-冰雕库-气调库-茶叶库安装-医药疫苗冷库-食品物流恒温恒湿车间-杭州领顺实业有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | PAS糖原染色-CBA流式多因子-明胶酶谱MMP-上海研谨生物科技有限公司 | 抓斗式清污机|螺杆式|卷扬式启闭机|底轴驱动钢坝|污水处理闸门-方源水利机械 | 影视模板素材_原创专业影视实拍视频素材-8k像素素材网 | 工业铝型材生产厂家_铝合金型材配件批发精加工定制厂商 - 上海岐易铝业 | 红立方品牌应急包/急救包加盟,小成本好项目代理_应急/消防/户外用品加盟_应急好项目加盟_新奇特项目招商 - 中红方宁(北京) 供应链有限公司 | 桨叶搅拌机_螺旋挤压/方盒旋切造粒机厂家-无锡市鸿诚输送机械有限公司 | 汽液过滤网厂家_安平县银锐丝网有限公司| 东莞喷砂机-喷砂机-喷砂机配件-喷砂器材-喷砂加工-东莞市协帆喷砂机械设备有限公司 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 耐高温电缆厂家-远洋高温电缆 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 不锈钢电动球阀_气动高压闸阀_旋塞疏水调节阀_全立阀门-来自温州工业阀门巨头企业 | 礼仪庆典公司,礼仪策划公司,庆典公司,演出公司,演艺公司,年会酒会,生日寿宴,动工仪式,开工仪式,奠基典礼,商务会议,竣工落成,乔迁揭牌,签约启动-东莞市开门红文化传媒有限公司 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 深圳激光打标机_激光打标机_激光焊接机_激光切割机_同体激光打标机-深圳市创想激光科技有限公司 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 深圳工程师职称评定条件及流程_深圳职称评审_职称评审-职称网 | 乐考网-银行从业_基金从业资格考试_初级/中级会计报名时间_中级经济师 | 行吊_电动单梁起重机_双梁起重机_合肥起重机_厂家_合肥市神雕起重机械有限公司 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 嘉兴泰东园林景观工程有限公司_花箱护栏 | 专注提供国外机电设备及配件-工业控制领域一站式服务商-深圳市华联欧国际贸易有限公司 | 艾默生变频器,艾默生ct,变频器,ct驱动器,广州艾默生变频器,供水专用变频器,风机变频器,电梯变频器,艾默生变频器代理-广州市盟雄贸易有限公司官方网站-艾默生变频器应用解决方案服务商 | 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 江苏农村商业银行招聘网_2024江苏农商行考试指南_江苏农商行校园招聘 | 旋片真空泵_真空泵_水环真空泵_真空机组-深圳恒才机电设备有限公司 | 锂电池砂磨机|石墨烯砂磨机|碳纳米管砂磨机-常州市奥能达机械设备有限公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 上海盐水喷雾试验机_两厢式冷热冲击试验箱-巨怡环试 | 烟台游艇培训,威海游艇培训-烟台市邮轮游艇行业协会 | 隔爆型防爆端子分线箱_防爆空气开关箱|依客思 | 东莞压铸厂_精密压铸_锌合金压铸_铝合金压铸_压铸件加工_东莞祥宇金属制品 | 邢台人才网_邢台招聘网_邢台123招聘【智达人才网】 |