无论是使用Web Service、RESTful或者其它的基于Http协议的交互方案,不可避免的都需要解决通信方面的安全问题,常见的无非就是:

1. 明文传输密码。

2. 重放攻击(相关概念参见《HTTP安全-重放攻击》)。

3. 请求来源非法。

本文通过SHA1算法加/解密相关数据,为客户端和服务端的通信提供一种有效可行的解决办法。以获取用户数据为例,我们希望通过地址http://xxx.com/user/get?id=1获得用户A的相关信息。如果该地址暴露在公网上,我们当然希望只有合法的人能够获得该信息,不合法的人被拒之门外,有恶意的人想要获得该数据需要耗费大量的成本。那么我们可以遵循以下过程去做:

1. 一个appid:是客户端的唯一标识,用来确定请求从哪里来;一个私有秘钥:在客户端和服务端分别存放一份,该秘钥不会在网络上传输;一个时间戳:就是当前时间的毫秒数。

2. 在客户端使用SHA1算法将appid,客户端秘钥,时间戳按照一定顺序加密得到一个字符串。

3. 构造http请求,将appid,时间戳,加密得到的字符串和需要传输的数据发送给服务端。

4. 服务端接收到客户端的请求后,需要:

1) 将时间戳与服务器当前时间作比对,如果超时,则认定该请求非法。

2) 验证appid是否存在,如果存在取得其在服务器端存放的秘钥,如果不存在或者秘钥不存在则该请求非法。

3) 将appid,服务器端秘钥,时间戳按照一定顺序加密,比对加密得到的字符串与客户端请求中的字符串是否相同,如果不同,则该请求非法。

4) 检查appid是否具有权限完成该请求。

5. 服务器端逻辑处理,返回数据。

以下为实现该过程的主要代码:

SHA1加密:

import java.security.MessageDigest;

public class SHA1Util {

public static String encode(String decript) throws Exception {

MessageDigest digest = MessageDigest.getInstance("SHA-1");

digest.update(decript.getBytes());

byte messageDigest[] = digest.digest();

// Create Hex String

StringBuffer hexString = new StringBuffer();

// 字节数组转换为 十六进制 数

for (int i = 0; i

String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);

if (shaHex.length()

hexString.append(0);

}

hexString.append(shaHex);

}

return hexString.toString();

}

}

生成加密串:

import com.xiaoleilu.hutool.StrUtil;

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

public class SignUtil {

public static String generate(String appid, String token, long millis) throws Exception {

String timestamp = String.valueOf(millis);

String signature = null;

if (StrUtil.isNotBlank(token) && StrUtil.isNotBlank(timestamp)

&& StrUtil.isNotBlank(appid)) {

List srcList = new ArrayList();

srcList.add(timestamp);

srcList.add(appid);

srcList.add(token);

// 按照字典序逆序拼接参数

Collections.sort(srcList);

Collections.reverse(srcList);

StringBuilder sb = new StringBuilder();

for (int i = 0; i

sb.append(srcList.get(i));

}

signature = SHA1Util.encode(sb.toString());

srcList.clear();

}

return signature;

}

}

如果希望更加安全的话,可以对需要传输的数据进行加密;还可以对需要传输的数据进行MD5加密,将MD5加密所得到的字符串加入到签名之中,这样可以保证数据合法有效。

另外,这种生成签名验证合法性的方式会比较慢,在应用中不太可能每一次都要重复此过程,一般都会在第一次进行身份验证时使用此方式来获得一个身份凭证,该凭证具有一定的有效期,过期后需要再次申请,在有效期内可以使用该凭证进行验证,提高程序运行效率,例子其实可以参见微信SDK。

http安全 Java_HTTP通信安全-身份验证 | 字痕随行相关推荐

  1. java webservice https_WebService的HTTPS访问——解决PKIX错误 | 字痕随行

    最近都在与Java打交道,将原来的项目用Java重构了一遍,所以之前的问题又再次浮出水面,在Axis2的WebService客户端生成完毕后,访问目标服务时报错,错误为"unable to ...

  2. idea安装activiti流程设计器_整合Activiti6.0流程设计器 | 字痕随行

    其它相关的文章索引: 最近一个多月都在尝试了解Activiti6.0,趁着放假整合编辑器这件事情终于有了些眉目,到此可以总结一下了. 第一步:下载源码 整合的时候肯定要从源码拷贝一些东西,有些问题出现 ...

  3. curl 支持ws吗_使用CURL请求WebService | 字痕随行

    之前有一篇文章(通过SSL\HTTPS调用WebService)介绍过如何使用HTTPS协议调用WebService,使用那篇文章介绍的方法确实可以解决大部分问题,但是总有一小波问题必须通过其它手段解 ...

  4. flowable并行审批_Flowable6.4 – 并行网关和包容网关 | 字痕随行

    这个春节的节奏就是:吃喝睡.吃喝睡,手机都懒的刷了.今天开始提振一下心情,整理一下思路,开始缓慢更新. 这次补完一下之前的一篇<Flowable6.4-排他网关>,简单介绍一下并行网关和包 ...

  5. c语言socket鉴权,建立套接字后进行socket.io身份验证

    小编典典 这实际上并不难,但是您正以错误的方式进行处理.几件事: 您不能使用socket.io 设置 cookie:但是,您可以随时获取任何已连接客户端的cookie值.为了设置cookie,您将必须 ...

  6. 亚马逊第三大卖家国家巴基斯坦电商营商环境如何?且看跨境电商数字身份验证服务商ADVANCE.AI要参解析

    跨境电商数字身份验证服务商ADVANCE.AI 成立于2016年,是领先的人工智能公司,提供数字转型.反欺诈和流程自动化等解决方案,已成功服务全球超700家知名企业客户,聚焦服务行业/领域包括银行.金 ...

  7. weblogic登录验证被拒绝_使用Kubernetes身份在微服务之间进行身份验证

    如果您的基础架构由相互交互的多个应用程序组成,则您可能会遇到保护服务之间的通信安全以防止未经身份验证的请求的问题. 想象一下,有两个应用程序: API datastore 您可能希望数datastor ...

  8. ASP.NET身份验证机制membership入门——配置篇(1){转}

    几乎所有的系统中都会使用到访问控制和角色管理这样的功能,例如:新建.修改.删除用户和角色,为用户分配角色,管理角色中的用户等等.于是MS在ASP.NET 2.0开始,实现了这些功能,使得我们在开发中, ...

  9. soapui 测试soap_使用SoapUI调用不同的安全WCF SOAP服务-基本身份验证,第一部分

    soapui 测试soap 在这个分为三部分的系列中,我将演示如何使用SoapUI API工具来调用安全的WCF SOAP服务. 第一篇文章将着重于创建将要测试的系统的服务. 第二篇文章将介绍在基本身 ...

最新文章

  1. 显微镜下的大明内容_《显微镜下的大明》epub、mobi、azw3
  2. bat curl 返回值_bat curl 发送http请求 监控网站
  3. Matlab心得及学习方法(不断更新)
  4. IO概述(概念分类)
  5. dj鲜生-28-登陆验证父类的使用-Mixin类的定义
  6. 【Spring Boot + Vue 实际案例】
  7. 网关信息认证服务器不可达,网关消息认证服务器不可达
  8. Ubuntu 16.04 解压rar问题解决方案
  9. docker+redis 持久化配置(AOF)
  10. oracle导出大数据
  11. 罗马数字转换器|罗马数字生成器
  12. JAMA Psychiatry:老年抑郁症患者的神经影像学、认知、临床症状和遗传学的异质性表征
  13. 文献管理——文献检索篇(一)
  14. 【网页前端】HTML基本语法之排版标签和表单标签
  15. 流体仿真中,六面体(Hex)网格的求解效率真的比四面体(Tet)高”很多”么?
  16. tp3框架部署时报错 _MODULE_NOT_EXIST_
  17. 微信摇一摇插件ios_微信密友插件ios下载-微信密友ios插件下载6.6.6最新版-西西软件下载...
  18. 利用Kmeans聚类进行用户分层分析
  19. 飘飘微课计算机百度云,数学微课_百度云资源_盘多多如风搜_盘搜搜_哎哟喂啊...
  20. 【设计模式】单例模式是什么?如何实现单例模式?单例模式常见问题?

热门文章

  1. Codeforces Round #FF
  2. IIS的安全配置策略
  3. 项目管理十大知识领域,为何不含
  4. Hibernate单表开发步骤
  5. ORA-08103: object no longer exists
  6. 背景选择器selector替换按钮默认背景
  7. 插件translator_Zotero Jasminum 插件的更新记录
  8. sql server numeric 可存几位小数_CBA中的10大传奇队长,将篮球精神一直传递下去,你认识几位呢?...
  9. html中函数传递多个值,JavaScript 实战开发经验!函数多参数传参技巧
  10. java tar 安装程序_linux下jdk的安装(tar包)