1.钉钉开放平台加解密方法

import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;/*** 钉钉开放平台加解密方法* 在ORACLE官方网站下载JCE无限制权限策略文件* JDK6的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html* JDK7的下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html*/
public class DingTalkEncryptor {private static final Charset CHARSET = Charset.forName("utf-8");private static final Base64 base64 = new Base64();private byte[] aesKey;private String token;private String corpId;private static final Integer AES_ENCODE_KEY_LENGTH = Integer.valueOf(43);private static final Integer RANDOM_LENGTH = Integer.valueOf(16);public DingTalkEncryptor(String token, String encodingAesKey, String corpId) throws DingTalkEncryptException {if(null != encodingAesKey && encodingAesKey.length() == AES_ENCODE_KEY_LENGTH.intValue()) {this.token = token;this.corpId = corpId;this.aesKey = Base64.decodeBase64(encodingAesKey + "=");} else {throw new DingTalkEncryptException(Integer.valueOf(900004));}}public Map<String, String> getEncryptedMap(String plaintext, Long timeStamp, String nonce) throws DingTalkEncryptException {if(null == plaintext) {throw new DingTalkEncryptException(Integer.valueOf(900001));} else if(null == timeStamp) {throw new DingTalkEncryptException(Integer.valueOf(900002));} else if(null == nonce) {throw new DingTalkEncryptException(Integer.valueOf(900003));} else {String encrypt = this.encrypt(DingTalkUtils.getRandomStr(RANDOM_LENGTH.intValue()), plaintext);String signature = this.getSignature(this.token, String.valueOf(timeStamp), nonce, encrypt);Map<String, String> resultMap = new HashMap();resultMap.put("msg_signature", signature);resultMap.put("encrypt", encrypt);resultMap.put("timeStamp", String.valueOf(timeStamp));resultMap.put("nonce", nonce);return resultMap;}}public String getDecryptMsg(String msgSignature, String timeStamp, String nonce, String encryptMsg) throws DingTalkEncryptException {String signature = this.getSignature(this.token, timeStamp, nonce, encryptMsg);if(!signature.equals(msgSignature)) {throw new DingTalkEncryptException(Integer.valueOf(900006));} else {String result = this.decrypt(encryptMsg);return result;}}private String encrypt(String random, String plaintext) throws DingTalkEncryptException {try {byte[] randomBytes = random.getBytes(CHARSET);byte[] plainTextBytes = plaintext.getBytes(CHARSET);byte[] lengthByte = DingTalkUtils.int2Bytes(plainTextBytes.length);byte[] corpidBytes = this.corpId.getBytes(CHARSET);ByteArrayOutputStream byteStream = new ByteArrayOutputStream();byteStream.write(randomBytes);byteStream.write(lengthByte);byteStream.write(plainTextBytes);byteStream.write(corpidBytes);byte[] padBytes = PKCS7Padding.getPaddingBytes(byteStream.size());byteStream.write(padBytes);byte[] unencrypted = byteStream.toByteArray();byteStream.close();Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keySpec = new SecretKeySpec(this.aesKey, "AES");IvParameterSpec iv = new IvParameterSpec(this.aesKey, 0, 16);cipher.init(1, keySpec, iv);byte[] encrypted = cipher.doFinal(unencrypted);String result = base64.encodeToString(encrypted);return result;} catch (Exception var15) {throw new DingTalkEncryptException(Integer.valueOf(900007));}}private String decrypt(String text) throws DingTalkEncryptException {byte[] originalArr;byte[] networkOrder;try {Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keySpec = new SecretKeySpec(this.aesKey, "AES");IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(this.aesKey, 0, 16));cipher.init(2, keySpec, iv);networkOrder = Base64.decodeBase64(text);originalArr = cipher.doFinal(networkOrder);} catch (Exception var9) {throw new DingTalkEncryptException(Integer.valueOf(900008));}String plainText;String fromCorpid;try {byte[] bytes = PKCS7Padding.removePaddingBytes(originalArr);networkOrder = Arrays.copyOfRange(bytes, 16, 20);int plainTextLegth = DingTalkUtils.bytes2int(networkOrder);plainText = new String(Arrays.copyOfRange(bytes, 20, 20 + plainTextLegth), CHARSET);fromCorpid = new String(Arrays.copyOfRange(bytes, 20 + plainTextLegth, bytes.length), CHARSET);} catch (Exception var8) {throw new DingTalkEncryptException(Integer.valueOf(900009));}if(!fromCorpid.equals(this.corpId)) {throw new DingTalkEncryptException(Integer.valueOf(900010));} else {return plainText;}}public String getSignature(String token, String timestamp, String nonce, String encrypt) throws DingTalkEncryptException {try {String[] array = new String[]{token, timestamp, nonce, encrypt};Arrays.sort(array);StringBuffer sb = new StringBuffer();for(int i = 0; i < 4; ++i) {sb.append(array[i]);}String str = sb.toString();MessageDigest md = MessageDigest.getInstance("SHA-1");md.update(str.getBytes());byte[] digest = md.digest();StringBuffer hexstr = new StringBuffer();String shaHex = "";for(int i = 0; i < digest.length; ++i) {shaHex = Integer.toHexString(digest[i] & 255);if(shaHex.length() < 2) {hexstr.append(0);}hexstr.append(shaHex);}return hexstr.toString();} catch (Exception var13) {throw new DingTalkEncryptException(Integer.valueOf(900006));}}
}

2.钉钉jsapi签名工具类

import java.security.MessageDigest;
import java.util.Formatter;/*** 钉钉jsapi签名工具类*/public class DingTalkJsApiSingnature {public DingTalkJsApiSingnature() {}public static String getJsApiSingnature(String url, String nonce, Long timeStamp, String jsTicket) throws DingTalkEncryptException {String plainTex = "jsapi_ticket=" + jsTicket + "&noncestr=" + nonce + "&timestamp=" + timeStamp + "&url=" + url;String signature = "";try {MessageDigest crypt = MessageDigest.getInstance("SHA-1");crypt.reset();crypt.update(plainTex.getBytes("UTF-8"));signature = byteToHex(crypt.digest());return signature;} catch (Exception var7) {throw new DingTalkEncryptException(Integer.valueOf(900006));}}private static String byteToHex(byte[] hash) {Formatter formatter = new Formatter();byte[] var2 = hash;int var3 = hash.length;for(int var4 = 0; var4 < var3; ++var4) {byte b = var2[var4];formatter.format("%02x", new Object[]{Byte.valueOf(b)});}String result = formatter.toString();formatter.close();return result;}public static void main(String[] args) throws Exception {String url = "http://10.62.53.138:3000/jsapi";String nonce = "abcdefgh";Long timeStamp = Long.valueOf(1437027269927L);String tikcet = "zHoQdGJuH0ZDebwo7sLqLzHGUueLmkWCC4RycYgkuvDu3eoROgN5qhwnQLgfzwEXtuR9SDzh6BdhyVngzAjrxV";System.err.println(getJsApiSingnature(url, nonce, timeStamp, tikcet));}
}

3.PKCS7算法的加密填充

import java.nio.charset.Charset;
import java.util.Arrays;/** PKCS7算法的加密填充*/public class PKCS7Padding {private static final Charset CHARSET = Charset.forName("utf-8");private static final int BLOCK_SIZE = 32;public PKCS7Padding() {}public static byte[] getPaddingBytes(int count) {int amountToPad = 32 - count % 32;if(amountToPad == 0) {amountToPad = 32;}char padChr = chr(amountToPad);String tmp = new String();for(int index = 0; index < amountToPad; ++index) {tmp = tmp + padChr;}return tmp.getBytes(CHARSET);}public static byte[] removePaddingBytes(byte[] decrypted) {int pad = decrypted[decrypted.length - 1];if(pad < 1 || pad > 32) {pad = 0;}return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);}private static char chr(int a) {byte target = (byte)(a & 255);return (char)target;}
}

4.钉钉开放平台加解密异常类

import java.util.HashMap;
import java.util.Map;/*** 钉钉开放平台加解密异常类*/
public class DingTalkEncryptException extends Exception {/**成功**/public static final int SUCCESS = 0;/**加密明文文本非法**/public final static int  ENCRYPTION_PLAINTEXT_ILLEGAL = 900001;/**加密时间戳参数非法**/public final static int  ENCRYPTION_TIMESTAMP_ILLEGAL = 900002;/**加密随机字符串参数非法**/public final static int  ENCRYPTION_NONCE_ILLEGAL = 900003;/**不合法的aeskey**/public final static int AES_KEY_ILLEGAL = 900004;/**签名不匹配**/public final static int SIGNATURE_NOT_MATCH = 900005;/**计算签名错误**/public final static int COMPUTE_SIGNATURE_ERROR = 900006;/**计算加密文字错误**/public final static int COMPUTE_ENCRYPT_TEXT_ERROR  = 900007;/**计算解密文字错误**/public final static int COMPUTE_DECRYPT_TEXT_ERROR  = 900008;/**计算解密文字长度不匹配**/public final static int COMPUTE_DECRYPT_TEXT_LENGTH_ERROR  = 900009;/**计算解密文字corpid不匹配**/public final static int COMPUTE_DECRYPT_TEXT_CORPID_ERROR  = 900010;private static final long serialVersionUID = -7009381945707655052L;private static Map<Integer,String> msgMap = new HashMap<Integer,String>();static{msgMap.put(SUCCESS,"成功");msgMap.put(ENCRYPTION_PLAINTEXT_ILLEGAL,"加密明文文本非法");msgMap.put(ENCRYPTION_TIMESTAMP_ILLEGAL,"加密时间戳参数非法");msgMap.put(ENCRYPTION_NONCE_ILLEGAL,"加密随机字符串参数非法");msgMap.put(SIGNATURE_NOT_MATCH,"签名不匹配");msgMap.put(COMPUTE_SIGNATURE_ERROR,"签名计算失败");msgMap.put(AES_KEY_ILLEGAL,"不合法的aes key");msgMap.put(COMPUTE_ENCRYPT_TEXT_ERROR,"计算加密文字错误");msgMap.put(COMPUTE_DECRYPT_TEXT_ERROR,"计算解密文字错误");msgMap.put(COMPUTE_DECRYPT_TEXT_LENGTH_ERROR,"计算解密文字长度不匹配");msgMap.put(COMPUTE_DECRYPT_TEXT_CORPID_ERROR,"计算解密文字corpid或者suiteKey不匹配");}public Integer  code;public DingTalkEncryptException(Integer exceptionCode){super(msgMap.get(exceptionCode));this.code = exceptionCode;}
}

5.加解密工具类

package com.maycur.dingtalk.common.util.aes;import java.util.Random;/*** 加解密工具类*/
public class DingTalkUtils {public DingTalkUtils() {}public static String getRandomStr(int count) {String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for(int i = 0; i < count; ++i) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}public static byte[] int2Bytes(int count) {byte[] byteArr = new byte[]{(byte)(count >> 24 & 255), (byte)(count >> 16 & 255), (byte)(count >> 8 & 255), (byte)(count & 255)};return byteArr;}public static int bytes2int(byte[] byteArr) {int count = 0;for(int i = 0; i < 4; ++i) {count <<= 8;count |= byteArr[i] & 255;}return count;}
}

钉钉/微信开放平台加解密(钉钉/微信加密解密) 钉钉/微信AES 加密解密相关推荐

  1. 多多客api_多多客小程序如何配置微信开放平台?

    原标题:多多客小程序如何配置微信开放平台? https://open.weixin.qq.com/ open: appid: xxx //微信开放平台AppID appsecret: xxx //微信 ...

  2. 微信开放平台开发——网页微信扫码登录(OAuth2.0)

    1.OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. 允许用户提供 ...

  3. 微信开放平台开发 微信登录

    在这篇微信公众平台开发教程中,我们将介绍如何使用微信开放平台接口实现微信扫码登录的功能. 准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统. 在进行微信O ...

  4. 微信开放平台开发(3) 移动应用微信登录

    原文:http://www.cnblogs.com/txw1958/p/weixin-applogin.html 在这篇微信公众平台开发教程中,我们将介绍如何使用微信开放平台接口实现移动应用微信登录的 ...

  5. 第三方App接入微信登录 解读 (微信开放平台)

    http://www.cnblogs.com/linjunjie/p/6249989.html 微信开放平台  和  微信公众平台  概念不同. 1.首先需要注册微信开放平台,然后获取开发者认证.审批 ...

  6. 微信网页第三方登录原理 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众

    微信网页第三方登录原理 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平 ...

  7. 微信开放平台开发(2) 网站应用微信登录

    关键字:微信公众平台 微信开放平台 微信登录 微信扫码登录 使用微信账号登录网站 作者:方倍工作室  原文:http://www.cnblogs.com/txw1958/p/weixin-qrlogi ...

  8. 关于微信开放平台开发者资质认证的简单记录

    微信开放平台网址:https://open.weixin.qq.com 申请微信开放平台的主要目的:实现APP或者网站的微信登录. 所以要实现APP或者网站的微信登录,必须通过微信开放平台开发者资质认 ...

  9. 微信开放平台与公众平台授权区别

    微信开放平台 授权登录主要用于PC端,手机端打开微信空白 微信公众平台 h5页面授权登录,手机端和pc端微信都能使用 如果想要开放平台的与公众平台的unionid相同,绑定即可,同一开放平台下的所有移 ...

  10. 关于微信开放平台授权事件接收Url的配置以及参数接收

    关于微信开放平台如何申请,如何配置,如何全网发布的文章,大神们已经写了很多,不想再造轮子,特针对微信授权事件的处理这一个点,对自己遇到的坑进行总结,也希望能给着手做微信开放平台的小伙伴们提供一份简单的 ...

最新文章

  1. validating和validated的区别
  2. js(jQuery)获取时间的方法及常用时间类
  3. Angular 星级评分组件
  4. vba 将xml导入到excel
  5. 详述一则数据库死锁故障的分析过程
  6. 云小课 | MRS基础入门之HDFS组件介绍
  7. 如何用servle和c3p0-DBUtils实现用户登录功能
  8. java 事件分发机制_读Android源码之事件分发机制最全总结
  9. Python12/10--前端之display/overflow使用/清浮动的方式
  10. 基于springboot的校园竞赛报名管理系统
  11. PostgreSQL下载安装教程(及PostGIS)
  12. iOS系列—wakeup in XNU
  13. 人工智能行业每日必读(01·17)
  14. 微信小程序 js创建Object对象
  15. 一款非常经典的蓝牙多媒体芯片​RDA5850
  16. IP协议及MAC帧格式
  17. ai描边工具怎么打开_ai描边面板怎么调出来? ai找不到描边面板的解决办法
  18. “十进制网络”遭质疑 数字域名被当作笑话
  19. python执行cmd命令,并获得返回值
  20. rule34服务器不稳定,rule34网站

热门文章

  1. Centos6 yum源设置
  2. VMwarenbsp;vSpherenbsp;ESXiamp;nb…
  3. 数论基础题(1) 费马引理+卡特兰数+Lucas定理+同余方程+扩欧
  4. vsCode自动保存与浏览器自动刷新
  5. Android 中关于九宫格图片的那些事
  6. kali linux 账号管理
  7. 请编程序将“China”译成密码,密码规律是:用原来的字母后面第四个字母代替原来的字母。
  8. PNP NPN 三线制接近开关接线
  9. 深圳java程序员培训班哪里最好,深圳java程序员培训学费(学习Java要不要报班)
  10. 移动端点击事件的延迟