Java中使用 Md5+Key的方式对Url签名防篡改

本文介绍了使用MD5和密钥对URL进行签名以防止篡改的方法,详细讲解了签名生成步骤,包括参数排序、拼接、MD5计算及签名验证,适用于API安全防护。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、Java中使用 Md5+Key的方式对Url签名防篡改

最近系统接入支付宝,在demo中看到了如何对get请求的url签名防止篡改的方法,觉得不错特此记录一下。

实现方式是:Md5(url+key) 的方式进行的。

1、key可以是任意的字符串,然后“客户端”,“服务器端”各自保留一份,千万不能外泄。

2、请求的URL例如:  name=jack&age=18

3、 URL+Key字符串拼接后的值用MD5加密生成签名,将签名发送到服务器端,同时服务器端已同样的方式计算出签名,然后比较俩个MD5的值是否相同,来确定URL是否被篡改。

4、别人拿不到key是无法正确计算出签名的。

原文链接:https://blog.youkuaiyun.com/nimasike/article/details/48000249

 

2、url增加签名验证防篡改

学习给API加上签名加密验证功能,摘抄了腾讯支付的说明书文档————————————————————————————————————————————————————————

为了提高传输过程参数的防篡改性,必须使用签名参数sig。

  1. 签名参数sig生成的步骤

第1步: 把需要包含在签名中的参数按key升序排序。 具体需要包含哪些参数,见各接口参数说明中关于sig的描述。
第2步: 把排序后的key和它对应的value拼接成一个字符串。
第3步: 把分配给商家的appkey拼接在第2步得到的字符串后面。
第4步: 计算第3步字符串的md5值,使用md5值的16进制字符串作为sig的内容。

  1. 示例
    原始请求信息
    应用ID:appid=600
    商户appkey=4dd1af55f7f140ac8827518472af3d87
    原始请求:
    http://openapi.pengyou.qq.com/v2/r/qzone/qz_get_balance?
    appid=600&
    appkey=HWAffC6MK1DQ5ztm&
    appname=app600&
    device=0&
    openid=00000000000000000000000000000009&
    openkey=1111111111446414117133E71111111111C50AE4A7111111&
    ts=1300444184&
    userip=112.90.139.30
    查询时需要包含在签名里的参数:appid,appkey,appname,openid,openkey,ts。
    下面开始生成sig:
    第1步: 将参数按key升序排序
    得到:appid,appkey,appname,openid,openkey,ts

第2步: 把所有键值对字符串拼接成一个字符串得到:
appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184

第3步: 把分配给商家的appkey拼接在第2步骤得到的字符串后面得到:
appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184
HWAffC6MK1DQ5ztm

第4步: 计算第3步骤字符串的md5值
md5
(appid600appkeyHWAffC6MK1DQ5ztmappnameapp600openid00000000000000000000000000000009
openkey1111111111446414117133E71111111111C50AE4A7111111ts1300444184
HWAffC6MK1DQ5ztm)
得到:
sig=eddf71eaa362748beda2cca96a4786ff

加签名后的请求串
http://openapi.pengyou.qq.com/v2/r/qzone/qz_get_balance?
appid=600&
appkey=HWAffC6MK1DQ5ztm&
appname=app600&
device=0&
openid=00000000000000000000000000000009&
openkey=1111111111446414117133E71111111111C50AE4A7111111&
ts=1300444184&
userip=112.90.139.30&
sig=4d7c026abf32d84cc8afb9f36d365e28

FAQ

  1. 为什么总是返回“1000:请求参数数错误”?
  2. 生成sig的时候:
    (1)第一步中,把device也作为签名的因子了。注意sig生成时具体需要包含哪些参数,见各接口参数说明中关于sig的描述。
    (2)第二步中,拼接字符串时,没有将key排序后,再进行key-value字符串拼接。
    (3)第二步中,拼接字符串时,把‘=’,‘&’也放签名原串里面了。注意只拼接key和它对应的value。
    建议开发者按照API接口示例中的HTTP请求源串自行生成sig,然后和示例中的sig进行比对,如果不同,说明生成过程有误,请按步骤仔细检查,重新生成。
  3. 测试环境和正式环境下OpenAPI的IP地址是不一样的,测试联调的IP是119.147.19.43,不要联调到正式环境上。
  4. 如果上述原因都排除,还是出现请求参数错误,请联系腾讯社区开放平台服务团队的支付API技术支持人员,提供同一次请求里面的信息:
    (1)HTTP请求源串。
    (2)实现签名时,做md5前的原串和md5后的签名。

  5. 如果参数中包含URI非法字符,是应该先做urlencode,还是先生成签名?
    服务后台会先对请求包进行URL解码,再对解码后的sig进行校验,因此请先按照上面的步骤生成sig签名值,然后再对请求进行urlencode。

原文链接:https://blog.youkuaiyun.com/litianquan/article/details/78442580

 

其他资料:

java通过sign签名+时间戳的方式防止rest接口被恶意抓包调用和重放

App开放接口api安全性—Token签名sign的设计与实现

开放api接口签名验证,添加sign,时间戳

浅谈URL参数的sign签名认证

 

<think>嗯,用户问的是在鸿蒙NEXT开发中使用阿里云播放器安全下载视频的方法。首先,我需要确认几个关键点。鸿蒙NEXT可能指的是HarmonyOS NEXT,也就是华为最新的操作系统版本。阿里云播放器可能是指阿里云提供的视频播放SDK或者相关的云服务。 用户提到的“安全下载视频”可能涉及两个方面:一是下载过程的安全性,比如使用HTTPS、数据加密等;二是下载后的视频存储和访问权限控制,防止未授权访问。需要从这两个方面来考虑解决方案。 首先,下载过程的安全。通常,使用阿里云OSS(对象存储服务)来存储视频文件时,可以通过HTTPS协议进行传输,确保数据在传输过程中不被窃听或篡改。此外,生成临时访问凭证(STS Token)来限制访问权限和时间,避免长期有效的密钥泄露风险。 其次,下载到本地的视频文件如何安全存储。鸿蒙系统提供了沙盒机制,应用的数据存储在私有目录下,其他应用无法访问。需要确保视频文件下载到应用的沙盒目录中,而不是公共目录。另外,可以考虑对本地文件进行加密存储,比如使用AES加密,这样即使设备被root,视频内容也不容易被提取。 然后,关于阿里云播放器的集成。需要查阅阿里云官方文档,确认他们的播放器SDK是否支持HarmonyOS NEXT,以及如何集成到项目中。可能需要添加相关的依赖库,并在代码中初始化播放器,设置正确的鉴权参数。 另外,下载过程中可能涉及权限问题。鸿蒙应用需要声明网络权限和存储权限。在配置文件中请求相应的权限,并确保在运行时处理用户的权限授予。 还需要考虑视频的缓存管理。及时清理不再需要的缓存文件,防止存储空间被占用过多,同时避免敏感数据长期留存。 可能遇到的问题包括:阿里云SDK与HarmonyOS的兼容性问题,临时凭证的生成和刷新机制,本地加密解密性能的影响,以及如何在鸿蒙系统中正确处理文件路径和存储。 总结下来,步骤大致是:配置阿里云OSS和安全凭证,使用HTTPS下载到应用沙盒目录,对文件加密存储,集成播放器SDK并确保播放时解密,管理权限和缓存。同时,需要参考阿里云和鸿蒙的官方文档,确保各项配置正确。</think>在鸿蒙NEXT(HarmonyOS NEXT)开发中集成阿里云播放器并实现安全视频下载,需遵循以下核心步骤与注意事项: --- ### **一、前置准备** 1. **阿里云服务配置** - 开通OSS服务,创建Bucket并设置`HTTPS`访问策略 - 启用RAM访问控制,生成临时安全令牌(STS Token),避免直接使用主账号AK - 在Bucket权限中配置`CORS`规则,限制跨域请求来源 2. **鸿蒙项目配置** ```typescript // module.json5 添加权限 "requestPermissions": [ { "name": "ohos.permission.INTERNET" }, { "name": "ohos.permission.WRITE_USER_STORAGE" } ] ``` --- ### **二、安全下载实现** #### **1. 安全鉴权方案** - **推荐STS临时授权** ```java // 示例:通过后端获取STS Token(需自行实现) String securityToken = getSTSTokenFromServer(); OSSClient ossClient = new OSSClient(context, endpoint, credentialProvider); ``` - **签名URL加密(备选)** ```java GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(bucketName, objectKey); request.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)); // 1小时有效期 URL signedUrl = ossClient.generatePresignedUrl(request); ``` #### **2. 下载过程安全** - **强制HTTPS传输** ```java ClientConfiguration conf = new ClientConfiguration(); conf.setProtocol(Protocol.HTTPS); ``` - **文件完整性校验** ```java // 下载完成后校验MD5 String serverETag = ossObject.getObjectMetadata().getETag(); String localMD5 = calculateFileMD5(localPath); if (!serverETag.equals(localMD5)) throw new SecurityException("文件校验失败"); ``` #### **3. 本地存储安全** - **沙盒目录存储** ```java // 获取应用沙盒路径 String safePath = getFilesDir() + "/videos/"; ``` - **文件加密(可选)** ```java // 使用AES加密存储 byte[] encryptedData = CryptoUtils.aesEncrypt(fileData, secretKey); Files.write(encryptedData, new File(safePath + fileName)); ``` --- ### **三、阿里云播放器集成** 1. **添加SDK依赖** ```groovy // 在build.gradle中添加 implementation 'com.aliyun.sdk.android:AlivcPlayer:5.4.6.0' ``` 2. **安全播放示例** ```java AliyunVodPlayer player = new AliyunVodPlayer(context); // 使用加密URL或STS Token鉴权 player.setDataSource(signedUrl, null); player.prepare(); ``` --- ### **四、增强安全建议** 1. **防逆向保护** - 开启鸿蒙应用的代码混淆 - 使用华为HMS Core的[安全检测服务](https://developer.huawei.com/consumer/cn/hms/huawei-safetydetectkit/) 2. **通信安全** - 使用Certificate Pinning防止中间人攻击 - 敏感请求参数进行RSA加密 3. **定期更新** - 及时更新阿里云SDK至最新版本 - 关注鸿蒙安全公告更新 --- ### **五、典型问题排查** - **403权限错误**:检查STS Token有效期(建议设置为900-3600秒) - **播放失败**:确认视频格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值