云服务器内容精选

  • 密文解密过程 对密文进行BASE64解码。 byte[] encryptStr = Base64.getDecoder().decode(data); 使用AESKey进行解密。 Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); SecretKeySpec secretKey = new SecretKeySpec(加密密钥.getBytes(StandardCharsets.UTF_8), "AES"); cipher.init(2, secretKey); byte[] bytes = cipher.doFinal(encryptStr); 去掉rand_msg头部的16个随机字节,剩余的部分即为明文内容msg。 String dataStr = StringUtils.split(new String(bytes, StandardCharsets.UTF_8), "&")[1];
  • 签名校验/加解密术语 表1 术语 术语 说明 signature 消息签名,用于验证请求是否来自 OneAccess ,以防攻击者伪造。签名算法为HMAC-SHA256 + Base64。 AESKey AES算法的密钥,加密算法为AES/GCM/NoPadding + Base64。 msg 明文消息体,格式为JSON。 encrypt _msg 明文消息msg加密处理并进行Base64编码后的密文。
  • 明文加密过程 拼接明文字符串。明文字符串由16个字节的随机字符串、明文msg拼接组成,中间使用&进行连接。以下为Java语言示例: String dataStr = RandomStringUtils.random(16, true, false) + "&" + data; 对拼接后的明文字符串使用AESkey加密后,再进行Base64编码,获得密文encrypt_msg。以下为Java语言示例: Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding"); SecretKeySpec secretKey = new SecretKeySpec(加密密钥.getBytes(StandardCharsets.UTF_8), "AES"); cipher.init(1, secretKey); byte[] bytes = dataStr.getBytes(StandardCharsets.UTF_8); String ecnryptStr = Base64.getEncoder().encodeToString(cipher.doFinal(bytes));
  • 签名校验 为了让企业应用确认事件推送来自OneAccess,OneAccess将事件推送给企业应用回调服务时,请求body体中包含请求签名并以参数signature标识,企业应用需要验证此参数的正确性后再解密,验证步骤如下: 计算签名。 计算签名由签名密钥、Nonce值(nonce)、时间戳(timestamp)、事件类型(eventType)、消息体(data)5部分组成,中间使用&进行连接。采用HMAC-SHA256 + Base64算法进行加密。以下为Java语言签名示例: String message = nonce + "&" + timestamp + "&" + eventType + "&" + data; Mac mac = Mac.getInstance("HmacSHA256"); SecretKeySpec secretKey = new SecretKeySpec(签名密钥.getBytes(StandardCharsets.UTF_8), "HmacSHA256"); mac.init(secretKey); String newSignature = Base64.getEncoder().encodeToString(mac.doFinal(message.getBytes(StandardCharsets.UTF_8))); 比较计算的签名cal_signature与请求参数signature是否相等,相等则表示验证通过。 企业应用按照要求返回响应消息格式。
  • 响应参数 表2 响应参数 参数 参数类型 描述 code String 返回code码,200表示成功,失败错误码请参考公共返回码。 message String 响应结果说明。 data String 当未开启加密时,返回请求包体中的明文随机字符串。 当开启加密时,对请求包体中加密的随机字符串进行解密,返回重新加密的该随机字符串的值,需要解密得到消息内容,解密后有random、msg二个字段,其中msg即为明文消息内容。
  • 请求参数 表1 请求参数 参数 参数类型 描述 nonce String 随机数,与timestamp结合使用,用于防止请求重放攻击。 timestamp Integer 时间戳,与nonce结合使用,用于防止请求重放攻击。 eventType String 事件类型,此处事件类型为CHECK_URL。 data String 消息体,当未开启加密时,发送明文的随机字符串; 当开启加密时,发送加密的随机字符串,需要解密得到消息内容,解密后有random、msg二个字段,其中msg即为明文消息内容。 signature String 消息签名,signature计算结合企业应用填写的签名密钥(signatureSaltValue)、请求中的timestamp、nonce、加密的消息体。
  • 请求示例 未启用消息签名和加密的请求示例: {"nonce": "bqVHvThFGooCRjSf","timestamp": 1573784783795,"eventType": "CHECK_URL","data": "random string","signature": ""} 启用消息签名和加密的请求示例: {"nonce": "jmgjjEAJbrMzWmUw","timestamp": 15093849585,"eventType": "CHECK_URL","data": "jRqGWO08Tyuxq+ChqGFk7SiPCt6MgcUDvzP5CBYnD30=","signature": "K08yDiTEc094KoccOY+VYLQFxxQ="}