用java怎样java随机生成数字腾讯云里的签名窜

个回答红客学院 · 创始人 (已认证)这个要看源代码才能为你准确定位问题哦
下面XXXXXX是为了屏蔽我的key,key是没有问题的,是在应用管理页面拿出来的try{
//Use pemfile keys to test
String privStr = &-----BEGIN PRIVATE KEY-----
&MIGEAgEAMBAGBXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXGoOmM/dUjzoWDGdo7W0
&UgLOEUboRawcHs2vu59PVMChRANCAASJApILfiKk234jkUJF/fd4CVmTYa+bvFUN
&YmyLsKTEf5HM6wvOmEig8ukn6SRK+iSfvZaddP391Tunv5kQds38
&-----END PRIVATE KEY-----&;
//change public pem string to public string
String pubStr = &-----BEGIN PUBLIC KEY-----
&MFYwEAYHKoXXXXXXXXXXXXXXXXXXXXXXXXXXXXABFXyFSVJgekqVAugT2pLtYP3c
&59DZe4iGO1u4NhaADVp6BedXhFG+pXGd4M34IPFRRk6Sa4sB0Fn+Uw==
&-----END PUBLIC KEY-----&;
// generate signature
GenTLSSignatureResult result = GenTLSSignatureEx(, &yaya&, privStr);
if (0 == result.urlSig.length()) {
System.out.println(&GenTLSSignatureEx failed: & + result.errMessage);
System.out.println(&---
generate sig:
& + result.urlSig + &
// check signature
CheckTLSSignatureResult checkResult = CheckTLSSignatureEx(result.urlSig, , &xiaojun&, pubStr);
if(checkResult.verifyResult == false) {
System.out.println(&CheckTLSSignature failed: & + result.errMessage);
System.out.println(&
check sig ok -- expire time & + checkResult.expireTime + & -- init time & + checkResult.initTime + &
catch(Exception e)
e.printStackTrace();
}腾讯 · 产品经理 (已认证)扫描二维码扫描关注云+社区&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
腾讯云通信账号登录集成-Java签名工具类
摘要:最近使用腾讯云通信,忍不住要吐槽,若大的腾讯,居然连个写Java的人都没有,要不要这么轻视Java,连个像样点的Java版ServerSDK都不提供,只显示个“敬请期待”。实在忍受不了管方提供的签名代码。就不能收拾收拾好吗。一分钟能对接的东西让人耗费半小时读你代码。自己重新封装了个工具类,清爽多了:publicclassQChatUtils{privatestaticfinallongEXPIRE_SECOND=Long.valueOf(60*60*24*180);priva
最近使用腾讯云通信,忍不住要吐槽,若大的腾讯,居然连个写Java的人都没有,要不要这么轻视Java,连个像样点的Java版ServerSDK都不提供,只显示个“敬请期待”。
实在忍受不了管方提供的签名代码。就不能收拾收拾好吗。一分钟能对接的东西让人耗费半小时读你代码。
自己重新封装了个工具类,清爽多了:
public class QChatUtils {
private static final long EXPIRE_SECOND = Long.valueOf(60 * 60 * 24 * 180);
private static final String BC = &BC&;
private static final String SHA256withECDSA = &SHA256withECDSA&;
private static final String UTF8 = &UTF-8&;
private QChatUtils() {}
private static Signature getSignatureWithPrivateKey(PrivateKey privateKey, String content) throws Exception {
Signature signature = Signature.getInstance(SHA256withECDSA, BC);
signature.initSign(privateKey);
signature.update(content.getBytes(Charset.forName(UTF8)));
private static Signature getSignatureWithPublicKey(PublicKey publicKey, String content) throws Exception {
Signature signature = Signature.getInstance(SHA256withECDSA, BC);
signature.initVerify(publicKey);
signature.update(content.getBytes(Charset.forName(UTF8)));
private static PrivateKey getPrivateKey(String privateKeyStr) throws IOException {
Security.addProvider(new BouncyCastleProvider());
Reader reader = new CharArrayReader(privateKeyStr.toCharArray());
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
PEMParser parser = new PEMParser(reader);
PrivateKeyInfo privateKeyInfo = (PrivateKeyInfo) parser.readObject();
parser.close();
PrivateKey privateKey = converter.getPrivateKey(privateKeyInfo);
return privateK
private static PublicKey getPublicKey(String publicKeyStr) throws IOException {
Reader reader = new CharArrayReader(publicKeyStr.toCharArray());
PEMParser parser = new PEMParser(reader);
JcaPEMKeyConverter converter = new JcaPEMKeyConverter();
SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) parser.readObject();
parser.close();
PublicKey publicKey = converter.getPublicKey(subjectPublicKeyInfo);
return publicK
private static String getContent(String identifier, String time) {
StringBuffer sb = new StringBuffer();
sb.append(&TLS.appid_at_3rd:&).append(0).append(&/n&).append(&TLS.account_type:&).append(ThirdPartyUtils.QC_ACCOUNT_TYPE).append(&/n&).append(&TLS.identifier:&)
.append(identifier).append(&/n&).append(&TLS.sdk_appid:&).append(ThirdPartyUtils.QC_SDK_APP_ID).append(&/n&).append(&TLS.time:&).append(time).append(&/n&)
.append(&TLS.expire_after:&).append(EXPIRE_SECOND).append(&/n&);
return sb.toString();
* 生成UserSig
* @param identifier 用户ID
* @throws Exception
public static String getUserSig(String identifier) throws Exception {
String time = String.valueOf(System.currentTimeMillis() / 1000);
Signature signature = getSignatureWithPrivateKey(getPrivateKey(ThirdPartyUtils.QC_PRIVATE_KEY), getContent(identifier, time));
byte[] signatureBytes = signature.sign();
String sigTLS = Base64.encodeBase64String(signatureBytes);
map = new HashMap
map.put(&TLS.account_type&, 0);
map.put(&TLS.identifier&, identifier);
map.put(&TLS.appid_at_3rd&, 0);
map.put(&TLS.sdk_appid&, ThirdPartyUtils.QC_SDK_APP_ID);
map.put(&TLS.expire_after&, EXPIRE_SECOND);
map.put(&TLS.version&, &&);
map.put(&TLS.sig&, sigTLS);
map.put(&TLS.time&, time);
JSONObject jsonObject = JSONObject.fromObject(map);
String jsonString = jsonObject.toString();
Deflater deflater = new Deflater();
deflater.setInput(jsonString.getBytes(Charset.forName(UTF8)));
deflater.finish();
byte[] compressBytes = new byte[512];
int compressBytesLength = deflater.deflate(compressBytes);
deflater.end();
return new String(Base64Url.base64EncodeUrl(Arrays.copyOfRange(compressBytes, 0, compressBytesLength)));
* 验证签名
* @param userSig 签名
* @param identifier 用户ID
* @throws Exception
public static boolean checkUserSig(String userSig, String identifier) throws Exception {
Security.addProvider(new BouncyCastleProvider());
Base64 decoder = new Base64();
byte[] compressBytes = Base64Url.base64DecodeUrl(userSig.getBytes(Charset.forName(UTF8)));
Inflater inflater = new Inflater();
inflater.setInput(compressBytes, 0, compressBytes.length);
byte[] decompressBytes = new byte[1024];
int decompressLength = inflater.inflate(decompressBytes);
inflater.end();
String jsonString = new String(Arrays.copyOfRange(decompressBytes, 0, decompressLength));
JSONObject jsonObject = JSONObject.fromObject(jsonString);
String sigTLS = jsonObject.getString(&TLS.sig&);
byte[] signatureBytes = decoder.decode(sigTLS.getBytes(Charset.forName(UTF8)));
String sigTime = jsonObject.getString(&TLS.time&);
Signature signature = getSignatureWithPublicKey(QChatUtils.getPublicKey(ThirdPartyUtils.QC_PUBLIC_KEY), getContent(identifier, sigTime));
return signature.verify(signatureBytes);
public static void main(String[] args) {
String userSig = QChatUtils.getUserSig(&
System.out.println(&UserSig: & + userSig);
boolean checkResult = QChatUtils.checkUserSig(userSig, &
System.out.println(&Check UserSig Result: & + checkResult);
} catch (Exception e) {
e.printStackTrace();
使用的时候只需要调用
QChatUtils.getUserSig(identifier);// identifier
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
新用户大礼包!
现在注册,免费体验40+云产品,及域名优惠!
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
腾讯云通信账号登录集成-Java签名工具类相关信息,包括
的信息,所有腾讯云通信账号登录集成-Java签名工具类相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
InternationalImportSource(importsource)原文发表时间:本文参与,欢迎正在阅读的你也加入,一起分享。分享分享文章到朋友圈分享文章到 QQ分享文章到 QQ 空间分享文章到微博复制文章链接到剪贴板扫描二维码扫描关注云+社区148 篇文章39 人订阅相关文章来自专栏0来自专栏1来自专栏0来自专栏0来自专栏0来自专栏0扫描二维码扫描关注云+社区腾讯开放平台第三方应用签名参数sig的说明
本文档仅适用于OpenAPI V3.0接口的签名生成,由于是通用说明,本文中仅以/v3/user/get_info的签名生成作为示例。
签名值sig是将请求源串以及密钥根据一定签名方法生成的签名值,用来提高传输过程参数的防篡改性。
签名值的生成共有3个步骤:构造源串,构造密钥,生成签名值。详见下面的描述。
源串是由3部分内容用“&”拼接起来的:
HTTP请求方式
urlencode(uri)
urlencode(a=x&b=y&...)
源串构造步骤如下:
第1步:将请求的URI路径进行URL编码(URI不含host,URI示例:/v3/user/get_info)。
请开发者关注:,否则容易导致后面签名不能通过验证。
第2步:将除“sig”外的所有参数按key进行字典升序排列。
注:除非OpenAPI文档中特别标注了某参数不参与签名,否则除sig外的所有参数都要参与签名。
第3步:将第2步中排序后的参数(key=value)用&拼接起来,并进行URL编码。
请开发者关注:,否则容易导致后面签名不能通过验证。
第4步:将HTTP请求方式(GET或者POST)以及第1步和第3步中的字符串用&拼接起来。
注:Java_SDK_V3.0.6仅支持POST方式,如果用GET可能导致一直计算sig不正确。
源串构造示例如下
(由于是通用说明,这里以/v3/user/get_info作为示例,且示例中的请求串不可直接复制访问)
1. 原始请求信息:
appkey:228bfa3bd188ba37ebe8723
HTTP请求方式:GET
请求的URI路径(不含HOST):/v3/user/get_info
请求参数:openid=11111&openkey=2222&appid=123456&pf=qzone&format=json&userip=112.90.139.30
2. 下面开始构造源串:
第1步:将请求的URI路径进行URL编码,得到:&%2Fv3%2Fuser%2Fget_info
第2步:将除“sig”外的所有参数按key进行字典升序排列,排列结果为:appid,format,openid,openkey,pf,userip
第3步:将第2步中排序后的参数(key=value)用&拼接起来:
appid=123456&format=json&openid=11111&openkey=2222&pf=qzone&userip=112.90.139.30
然后进行URL编码(
编码时请关注,否则容易导致后面签名不能通过验证),编码结果为:
appid%3Dformat%3Djson%26openid%3D11111%26openkey%3D2222%26pf%3Dqzone%26userip%3D112.90.139.30
第4步:将HTTP请求方式,第1步以及第3步中的到的字符串用&拼接起来,得到源串:
GET&%2Fv3%2Fuser%2Fget_info&appid%3Dformat%3Djson%26openid%3D11111%26openkey%3D2222%26pf%3Dqzone%26userip%3D112.90.139.30
得到密钥的方式:在应用的appkey末尾加上一个字节的“&”,即appkey&,例如:
228bfa3bd188ba37ebe8723&
1. 使用HMAC-SHA1加密算法,使用Step2中得到的密钥对Step1中得到的源串加密。
(注:一般程序语言中会内置HMAC-SHA1加密算法的函数,例如PHP5.1.2之后的版本可直接调用hash_hmac函数。)
2. 然后将加密后的字符串经过Base64编码。
(注:一般程序语言中会内置Base64编码函数,例如PHP中可直接调用 base64_encode() 函数。)
3. 得到的签名值结果如下:
FdJkiDYwMj5Aj1UG2RUPc83iokk=
签名校验失败分为以下两种情况:
1. sig参数生成错误
有可能由下列原因引起:
(1)构造源串时注意URI不含host,如/v3/user/get_info,而不是http://113.108.20.23/v3/user/get_info;
(2)构造源串时,没有将key排序后,再将(key=value)用&拼接起来。
(3)构造密钥时,没有将appkey后加“&”。
(4)某些语言的URLEncode系统方法在进行URL编码时,并没有按照现行的URL编码规则进行。详见下文的:。
对于支付和营销类接口,除了以上问题外,还有一些特别容易出错的地方:
(1)支付和营销相关回调协议中规定参数值都为string型,开发商出于本地记账等目的,对接收到的某些参数值先转为数值型再转为string型,导致字符串部分被截断(例如:字符串“13.14”转为整形再转为string 就会变成13),从而导致签名出错。
如果要进行本地记账等逻辑,建议用另外的变量来保存数值,传参时必须用原始接收到的string型值。
(2)支付和营销相关回调协议中,在进行签名生成时多加了一个步骤:
在构造源串的第3步“将排序后的参数(key=value)用&拼接起来,并进行URL编码”之前,需对value先进行一次编码 (编码规则为:除了 0~9 a~z A~Z&!*() 之外其他字符按其ASCII码的十六进制加%进行表示,例如“-”编码为“%2D”)。
(3)支付和营销接口中的goodmeta参数,必须是UTF8格式,参与签名前要进行Base64编码。
(4)支付和营销接口中的payitem参数,含有*号字符,在进行URL编码时要注意观察是否进行了编码。
2. sig参数生成正确,但是参数传输前没有进行URL编码。
所有参数传输时都要进行URL编码,包括sig。如果没有进行URL编码,则即使sig是正确的,但是校验sig时不能匹配。
建议的解决方案:
(1)开发者可以使用平台提供的签名验证工具来计算签名: , 通过工具吐出的签名生成过程,来排查具体是哪一步出了问题。
(2)如果您是PHP开发者,可以使用PHP SDK中的签名生成函数来生成签名,避免自己去进行复杂的签名生成逻辑的开发。
URL编码规则:
签名验证时,要求对字符串中除了“-”、“_”、“.”之外的所有非字母数字字符都替换成百分号(%)后跟两位十六进制数。
十六进制数中字母必须为大写。
注意事项:
1. 某些系统方法,例如.NET系统方法HttpUtility.UrlEncode会将‘=’编码成‘%3d’,而不是%3D,导致加密签名通不过验证,请开发者注意检查。
2.Java 1.3和早期版本中,调用java.net.URLEncoder下的方法进行URL编码时,某些特殊字符并不会被编码,例如星号(*)。
由于URL编码规则中规定了星号(*)必须编码,因此在请求字符串中含星号(*)的情况下如果使用了上述方法,会导致生成的签名不能通过验证。
例如调用接口时, payitem参数值中一定会含有* ,在使用类java.net.URLEncoder下的方法进行编码后,需开发人员手动将星号字符“*”替换为“%2A”,否则将导致加密签名一直通不过验证,请开发者注意检查。
3. 某些语言的urlencode方法会把“空格”编码为“+”,实际上应该编码为“%2B”。这也将生成错误的签名,导致签名通不过验证。
请开发者注意检查,手动将“+”替换为“%2B”。在PHP中,推荐用rawurlencode方法进行URL编码。18:06 提问
腾讯云文字识别怎么连接
求个代码实例,腾讯的文档乱了。
个人是Java开发,怎么使用java后端完成图片传给腾讯并接受他们的返回的数据。
按时间排序
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐

我要回帖

更多关于 java生成随机数 的文章

 

随机推荐