API安全机制

2024-05-10 01:36
文章标签 api 机制 安全

本文主要是介绍API安全机制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

API安全机制包括两部分:数字签名、敏感信息加密。

一、数字签名

服务端使用客户端的消息签名验证客户端的身份。如果一个请求不包含签名或者签名验证失败,服务端将返回身份验证错误。它背后的技术是:数字签名技术。

1、待签参数准备

待签参数包含以下字段

参数说明
UrlUrl 指 Path + Query + Body 中 Form 参数,域名无需参与签名。组织方法:对 Query+Form 参数按照字典对 Key 进行排序后按照如下方法拼接,如果 Query 或 Form 参数为空,则 Url = Path,不需要添加 ?,如果某个参数的 Value 为空只保留 Key 参与签名,等号不需要再加入签名。Query参数的Value如果存在中文,则需要对Value值进行UrlEncode编码,否则会出现中文乱码或签名报错等情况。
Content-MD5指 Body 的 MD5 值,只有当 Body 非 Form 表单时才计算 MD5。把MD5摘要后的二进制数组使用Base64进行编码
Timestamp获取发起请求时的系统当前时间戳,即格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数,作为请求时间戳。例如1554208460

2、待签参数拼接

String stringToSign= 
Url + "\n" + 
Content-MD5 + "\n" 
Timestamp

注意:Content-MD5如果为空也需要参与拼接 。

3、计算签名

使用应用密钥(APP KEY)对待签名字符串采用HmacSHA256算法进行签名运算,然后使用Base64算法进行编码,从而得到签名字符串。

Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] appSecretBytes = appSecret.getBytes(Charset.forName("UTF-8"));
hmacSha256.init(new SecretKeySpec(appSecretBytes, 0, appSecretBytes.length, "HmacSHA256"));
byte[] md5Result = hmacSha256.doFinal(stringToSign.getBytes(Charset.forName("UTF-8")));
String signature = Base64.encodeBase64String(md5Result);

二、敏感信息加密

客户端如果有敏感字段需要上送,则需要对字段进行加密。服务端收到后,需要对敏感字段解密。

下面使用AES算法对敏感信息加解密。

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.util.Base64;public class MyTest {// AES算法private static final String ALGORITHM = "AES";// 使用CBC模式、PKCS5Padding填充private static final String TRANSFORMATION = "AES/CBC/PKCS5PADDING";/*** AES加密** @param secretKey 密钥* @param ivKey     偏移量* @param data      明文数据* @return 加密后的数据*/public static String encrypt(String secretKey, String ivKey, String data) {try {SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivParameterSpec = new IvParameterSpec(ivKey.getBytes(StandardCharsets.UTF_8));Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);byte[] encrypted = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypted);} catch (Exception e) {e.printStackTrace();}return null;}/*** AES解密** @param secretKey 密钥* @param ivKey     偏移量* @param data      加密后的数据* @return 明文数据*/public static String decrypt(String secretKey, String ivKey, String data) {try {SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), ALGORITHM);IvParameterSpec ivParameterSpec = new IvParameterSpec(ivKey.getBytes(StandardCharsets.UTF_8));Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8)));return new String(decrypted);} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) throws Exception {String secretKey = "1234567890123456";String ivKey = "1234567890123456";String data = "你好,世界";String encryptData = encrypt(secretKey, ivKey, data);System.out.println("加密后的数据:" + encryptData);String decryptData = decrypt(secretKey, ivKey, encryptData);System.out.println("解密后的数据:" + decryptData);}}

这篇关于API安全机制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/975063

相关文章

Discuz! Ucenter API for JAVA

my.oschina.net/xshuai/blog/280242原文地址  Discuz! Ucenter API for JAVA   使用自己的项目于discuz联合登陆注册。 源码和jar文件都在http://code.google.com/p/discuz-ucenter-api-for-java/  有。 我只测试了非中文的注册。中文注册可以去http://code.goog

【Python3-API】通用文字识别示例代码

Python3-urllib3-API通用OCR示例代码 AccessToken获取可以参考:http://ai.baidu.com/forum/topic/show/497663(Python3-urllib3示例)Python安装什么的。大家百度经验即可 -----------------------------------------------------下面开始代码------

【Python3-API】情感倾向分析示例代码

Python3-urllib3-API情感倾向分析示例代码 AccessToken获取可以参考:http://ai.baidu.com/forum/topic/show/497663(Python3-urllib3示例)Python安装什么的。大家百度经验即可 -----------------------------------------------------下面开始代码-----

【百度语音合成】JavaAPI方式语音合成示例

Java-SDK合成语音示例:http://ai.baidu.com/forum/topic/show/492725REST-API文档地址:http://ai.baidu.com/docs#/TTS-API/top 本帖子主要示例通过REST API进行语音合成。使用Java语言进行示例Demo测试 创建语音应用并获取apikey secretkey  通过GET方式获取access_to

【百度语音识别】JavaAPI方式语音识别示例 MP3转PCM文件Java实现

【百度语音识别】JavaAPI方式语音识别示例MP3转PCM Java-API合成语音示例:http://ai.baidu.com/forum/topic/show/496727REST-API文档地址:http://ai.baidu.com/docs#/TTS-API/top注意:需要下载MP3插件jar。才可以进行MP3CONVERTPCM 链接: https://pan.baidu.c

重试机制实现方案

大家好,我是阿飞云 怕什么真理无穷,进一步有近一步的欢喜 本文内容是目前团队内小磊同学对重试机制实现方案的梳理总结。 从为什么需要重试的背景开始,到重试的场景,大致的一些设计思路,最后通过两个成熟的retry组件进行案例讲解,理论+实战。 背景 重试是系统提高容错能力的一种手段。在一次请求中,往往需要经过多个服务之间的调用,由于网络波动或者其他原因,请求可能无法正常到达服务端或者服务端的请

关于百度map API for Android的mobile ak 102错误

一共有三个sha1值需要比对: 第一个是 sha1值是http://developer.baidu.com/map/sdkandev-14.htm 里面获得的sha1值(包括里面的cmd和界面的两种获取sha1值得方法) 第二个是 sha1值是打包好apk文件中META-INF 文件夹的CERT.RSA中的sha1值。http://bbs.lbsyun.baidu.com/vi

Pytorch学习笔记_2_Autograd自动求导机制

Autograd 自动求导机制 PyTorch 中所有神经网络的核心是 autograd 包。 autograd 包为张量上的所有操作提供了自动求导。它是一个在运行时定义的框架,可以通过代码的运行来决定反向传播的过程,并且每次迭代可以是不同的。 通过一些示例来了解 Tensor 张量 torch.tensor是这个包的核心类。 设置.requires_grad为True,会追踪所有对于

Kafka-核心架构-分区、副本(含副本选举机制)

Kafka概述 Kafka-核心架构-分区 Kafka的分区是将数据在主题(Topic)中逻辑上划分成多个片段的机制。 分区使得数据可以被水平扩展,提高了Kafka的可伸缩性和吞吐量,并允许数据在集群中分布和并行处理。 1.Kafka 分区的作用 (1)数据分布和负载均衡: Kafka通过将数据分割成多个分区并在集群中分布这些分区来实现数据的水平扩展和负载均衡。每个分区可以在集

跨域数据流动:数据提取过程中的治理与安全双轮驱动

跨域数据流动:数据提取过程中的治理与安全双轮驱动 随着信息技术的飞速发展,跨域数据流动已成为现代社会的常态。从医疗记录到金融交易,从社交媒体到企业运营,数据在各个领域之间频繁交换,为社会发展带来了极大的便利。然而,这种跨域数据流动也带来了治理和安全的双重挑战。本文将从治理和安全两个维度,探讨在数据提取过程中的双轮驱动策略。 一、数据治理:构建有序的跨域数据流动体系 在跨域数据流动的背景下,数