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

无论是使用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://www.mzph.cn/news/551412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬取行业数据_用Python进行Web爬取数据

介绍我们拥有的数据太少,无法建立机器学习模型。我们需要更多数据!如果这句话听起来很熟悉,那么你并不孤单!希望获得更多数据来训练我们的机器学习模型是一个一直困扰人们的问题。我们无法在数据科学项目中获得可以直接使用的Exce…

gradle compile mysql_Gradle配置implementation、api与compile的区别

自Gradle 3.4开始,compile被废弃,取而代之的是implementation和api两个配置项。掌握这三者的区别实际上就是要清楚什么情况使用implementation替换compile,什么情况下使用api替换compile。implementation替换compile使用implementation配置依…

python偶数列表_使用条件偶数列表创建带有地图的元组 - python

这是我的代码:evenorodd[1,2,3]list1[a,b,c]list2[A,B,C]res tuple(map(lambda x: True if x % 2 ! 0 else False, evenorodd))print(res)输出:(False, True, False, True)我想要这个:如果x%2! 0则为list1的元素(如果evenorodd的元素为奇数)list2 else的元素(如果e…

java 获取子线程_Java 主线程获取子线程返回结果

1.自定义package com.jgyang.com;public class MySyncThreadTest {public static void main(String[] args) throws Exception {CustomRunnable cRunnacle new CustomRunnable();Thread thread new Thread(cRunnacle,"子线程");thread.start(); //子线程执行System…

winpythonhadoop_让python在hadoop上跑起来

本文实例讲解的是一般的hadoop入门程序“WordCount”,就是首先写一个map程序用来将输入的字符串分割成单个的单词,然后reduce这些单个的单词,相同的单词就对其进行计数,不同的单词分别输出,结果输出每一个单词出现的频…

java解析html jsoup_2020-06-02 jsoup java解析html

AJsoupAJsoup 模块是快速将html 转换成bean 类似gson转换使用前提你了解jsoup并且了解jsoup的SelectGradlecompile com.github.zdongcoding:ajsoup:0.1.0Mavencom.github.zdongcodingajsoup0.1.0pom使用方法如下:bean.javaSelect(select "body")public c…

串口工具securecrt_SecureCRT配置华为交换机部分命令

点上方蓝字“工控先生”免费快速关注本文由“135编辑由于工作需要,昨天临时需要从华为的光电交换机上面的console口查看一些端口的状态等,现整理如下,有需要的可以参考一下:硬件准备串口线,华为交换机连接将RJ45连接到…

java byte 二维数组_[编程入门]二维数组的转置-题解(Java代码)

解题思路:注意事项:参考代码:import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int[][] a new int[3][3];for(byte i 0; i for(byte j 0;j a[i][j] scanner.nextInt();}}for(byte i 1; i i…

如何让nginx执行python代码_生产环境部署Python语言代码(django+uwsgi+nginx)

本文主要向大家介绍了生产环境部署Python语言代码(djangouwsginginx),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。基础环境不做介绍,在django开发web项目完成后,一直使用django自带的服务器进行调试&#xff1a…

天天向上续python3.3_Linux 配置系列 四 python3

一、环境准备JDK版本: jdk1.8; 操作系统: centos 7.6 ;Python::3.7.7; tomcat: apache-tomcat-8.5.5;二、配置python32.1 python3依赖包yum install gcc patch libffi-devel python-…

micropython用什么编译_micropython开发者指南

Authorshaniadolphin获取git工程mkdir micropythoncd micropythongit clone https://github.com/micropython/micropython.gitgit submodule update --init运行的结果如下:dolphinDESKTOP-DR5OKOG:/mnt/h/proj/micropython$ cd micropython/dolphinDESKTOP-DR5OKOG:…

java 跳转虚拟目录_java tomcat虚拟目录的深入了解

我们知道,Web网站中的内容(包括网页,图片,音频文件等)一般都存放在App的目录下。但随着网站内容的不断丰富,用户需要把不同层次的内容组织成网站的子目录。我们通常的做法是在网站主目录下新建子目录,并把相关的内容放…

redis工具类_SpringBoot 操作 Redis 数据

SpringBoot 操作 Redis 数据简介 Redis 是一个开源的NoSQL数据库,基于内存的键值存储,速度快。Redis 支持数据结构,如字符串,散列,列表,集和带范围查询的有序集。5种主要数据类型:字符串类型 …

java判断日期是否是同一周_JAVA里面怎样判断一个日期是否是星期六或者星期天,给出原代码,多谢!!!!!!!!!!...

分数全部奉上。|void test2(){String tmp "2001-09-02";SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");try {Date myDate sdf.parse(tmp);Calendar myCalendar Calendar.getInstance();myCalendar.setTime(myDate);int i myCalendar.get(…

python中继承是什么意思_Python面向对象中的继承是什么意思

Python面向对象中的继承是什么意思发布时间:2020-11-09 14:05:42

python ansible模块_ansible常用模块

一、ansible常用模块模块是Ansible执行的最小单位,可以是由Python编写,也可以是Shell编写,也可以是由其他语言编写。一、ping模块测试连接可通性,没有参数。通的话返回pong。1、使用示例ansible all -m ping1、可通,返…

java断点续传 框架_java实现断点续传

用java的URL实现了一个简单的断点续传的列子,不为别的,假如你对断点续传不了解一看就明白了呵呵,算不上高深啊package test;import java.io.FileNotFoundException;import java.io.IOException;import java.io.InputStream;import java.io.Ra…

python大文件排序_Python实现大文件排序的方法

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

python入门到实践试题及答案_python编程:入门到实践练习答案

【实例简介】书本《python编程:入门到实践》的课后练习答案【实例截图】【核心代码】练习答案├── Solutions - Chapter 10.docx├── Solutions - Chapter 11.docx├── Solutions - Chapter 15.docx├── Solutions - Chapter 16.docx├── Solutions - Cha…

java年份换算_java中日期的换算处理

JAVA8中的日期API是JSR-310的实现,并且是工作在ISO-8601日历系统基础上的,但我们也可以在非ISO的日历上。JDK8的日期API大致分为以下几个包:1 java.time包:JDK8中的基础包,所有常用的基础类都是这个包的一部分&#xf…