android api 签名是啥意思
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android api 签名是啥意思相关的知识,希望对你有一定的参考价值。
android api 签名是api调用的时候需要按照约定的参数生成一个字符串,对方接收到后校验参数,合法后接受请求并返回结果。所有android端的API的有效访问URL包括以下三个部分:
1. 资源访问路径,如/v1/deal/find_deals;
2. 请求参数:即API对应所需的参数名和参数值param=value,多个请求参数间用&连接
如deal_id=1-85462&appkey=00000;
3. 签名串,由签名算法生成
签名算法如下:
1. 对除appkey以外的所有请求参数进行字典升序排列;
2. 将以上排序后的参数表进行字符串连接,如key1value1key2value2key3value3...keyNvalueN;
3. 将app key作为前缀,将app secret作为后缀,对该字符串进行SHA-1计算,并转换成16进制编码;
4. 转换为全大写形式后即获得签名串
签名串获得后,将其作为sign参数附加到对应的URL中,即可正常访问API。
注意:请保证HTTP请求数据编码务必为UTF-8格式,URL也务必为UTF-8编码格式。
参考代码:
// 定义申请获得的appKey和appSecret
String appkey = "XXXXXXXX";
String secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
String apiUrl = "http://api.dianping.com/v1/business/find_businesses";
// 创建参数表
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("format", "json");
paramMap.put("city", "上海");
paramMap.put("latitude", "31.21524");
paramMap.put("longitude", "121.420033");
paramMap.put("category", "美食");
paramMap.put("region", "长宁区");
paramMap.put("limit", "20");
paramMap.put("radius", "2000");
paramMap.put("offset_type", "0");
paramMap.put("has_coupon", "1");
paramMap.put("has_deal", "1");
paramMap.put("keyword", "泰国菜");
paramMap.put("sort", "7");
// 对参数名进行字典排序
String[] keyArray = paramMap.keySet().toArray(new String[0]);
Arrays.sort(keyArray);
// 拼接有序的参数名-值串
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(appkey);
for (String key : keyArray)
stringBuilder.append(key).append(paramMap.get(key));
stringBuilder.append(secret);
String codes = stringBuilder.toString();
// 字符串连接示例
// XXXXXXXXcategory美食city上海formatjsonhas_coupon1has_deal1keyword泰国菜latitude31.21524limit20longitude121.420033offset_type0radius2000region长宁区sort7XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
// SHA-1编码, 这里使用的是Apache codec,即可获得签名(shaHex()会首先将中文转换为UTF8编码然后进行sha1计算,使用其他的工具包请注意UTF8编码转换)
/*
* 以下sha1签名代码效果等同
* byte[] sha = org.apache.commons.codec.digest.DigestUtils.sha(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(codes));
* String sign = org.apache.commons.codec.binary.Hex.encodeHexString(sha).toUpperCase();
*/
String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();
//签名示例
//7D78381BC58E1DB1DBA4BD965916FE6B4D5DC892 参考技术A 首先我们得知道什么是摘要,摘要是指采用单向Hash函数对数据进行计算生成的固定长度的Hash值,摘要算法有Md5,Sha1等,Md5生成的Hash值是128位的数字,即16个字节,用十六进制表示是32个字符,Sha1生成的Hash值是160位的数字,即20个字节,用十六进制表示是40个字符。我们是不能通过摘要推算出用于计算摘要的数据,如果修改了数据,那么它的摘要一定会变化(其实这句话并不正确,只是很难正好找到不同的数据,而他们的摘要值正好相等)。摘要经常用于验证数据的完整性,很多下载网站都会列出下载文件的md5值或者sha1值。
摘要和签名没有任何关系,网上常常将摘要和签名混为一谈,这是错误的。签名和数字签名是同一个概念,是指信息的发送者用自己的私钥对消息摘要加密产生一个字符串,加密算法确保别人无法伪造生成这段字符串,这段数字串也是对信息的发送者发送信息真实性的一个有效证明。其他发送者用他们的私钥对同一个消息摘要加密会得到不同的签名,接收者只有使用发送者签名时使用的私钥对应的公钥解密签名数据才能得到消息摘要,否则得到的不是正确的消息摘要。
数字签名是非对称密钥加密技术+数字摘要技术的结合。
数字签名技术是将信息摘要用发送者的私钥加密,和原文以及公钥一起传送给接收者。接收者只有用发送者的公钥才能解密被加密的信息摘要,然后接收者用相同的Hash函数对收到的原文产生一个信息摘要,与解密的信息摘要做比对。如果相同,则说明收到的信息是完整的,在传输过程中没有被修改;不同则说明信息被修改过,因此数字签名能保证信息的完整性。并且由于只有发送者才有加密摘要的私钥,所以我们可以确定信息一定是发送者发送的。
另外还需要理解一个概念:数字证书。数字证书是一个经证书授权中心数字签名的包含公钥及其拥有者信息的文件。数字证书的格式普遍采用的是X.509V3国际标准,一个标准的X.509数字证书包含以下一些内容:证书的版本信息:
1)证书的序列号,每个证书都有一个唯一的证书序列号;
2)证书所使用的签名算法;
3)证书的发行机构名称,命名规则一般采用X.500格式;
4)证书的有效期,通用的证书一般采用UTC时间格式,它的计时范围为1950-2049;
5)证书所有人的名称,命名规则一般采用X.500格式;
6)证书所有人的公开密钥;
7)证书发行者对证书的签名。
CERT.RSA包含了数字签名以及开发者的数字证书。CERT.RSA里的数字签名是指对CERT.SF的摘要采用私钥加密后的数据,Android系统安装apk时会对CERT.SF计算摘要,然后使用CERT.RSA里的公钥对CERT.RSA里的数字签名解密得到一个摘要,比较这两个摘要便可知道该apk是否有正确的签名,也就说如果其他人修改了apk并没有重新签名是会被检查出来的。
需注意Android平台的证书是自签名的,也就说不需要权威机构签发,数字证书的发行机构和所有人是相同的,都是开发者自己,开发者生成公私钥对后不需要提交到权威机构进行校验。
这个函数的签名是啥意思?
【中文标题】这个函数的签名是啥意思?【英文标题】:What does this function's signature mean?这个函数的签名是什么意思? 【发布时间】:2018-02-06 12:07:37 【问题描述】:我正在关注这个tutorial,它有一个live example,它定义了这个函数:
onSelect(hero: Hero): void
this.selectedHero = hero;
: void
是我不明白的部分。这部分怎么称呼,有什么作用?
我的想法:这是函数的返回类型,但如果是这样的话,不应该
onSelect(hero: Hero): void
this.selectedHero = hero;
return hero;
抛出错误?该应用程序在 Plunker 中运行良好,控制台中没有显示错误(我想知道这是否与 Plunker 有关)。
函数是这样调用的:
<li *ngFor="let hero of heroes"
[class.selected]="hero === selectedHero"
(click)="onSelect(hero)">
<span class="badge">hero.id</span> hero.name
</li>
【问题讨论】:
onSelect(hero: Hero): Hero 原型?您的整个问题主体都没有提到原型。我猜你的意思是签名。 @gsamaras Ratio 我会说是正常的。可能会增加那些想知道“原型”但后来发现它一点也不有趣的人的流量,比如我自己 :-) 【参考方案1】:你的想法是正确的。它只是一个返回类型,就像其他编程语言(如 C#)中的函数一样。而当你返回Hero类型的对象时,它应该会报一个类似Type 'Hero' is not assignable to type 'void'
的错误,如下图所示:
【讨论】:
【参考方案2】:函数没有返回任何东西[void]
onSelect(hero: Hero): void
this.selectedHero = hero;
这个方法在调用时只是初始化类级别selectedHero
,并将英雄传递给方法。如果你看到 typescript 类,你会在组件中找到一个 selectedHero:Hero
变量。
【讨论】:
是的,我知道这门课。感谢您的回答,+1。但是我没有接受你的建议,因为你没有解释我的想法失败的原因。【参考方案3】:这意味着你的函数没有返回任何东西,你不能这样调用
let result = this.onSelect(someHero); // Here compiler will give you an error that the function can't be in the right side of the statement
查看示例here。可能是 Plunker 的错误,因为在他们的网站上你可以看到错误。
【讨论】:
以上是关于android api 签名是啥意思的主要内容,如果未能解决你的问题,请参考以下文章