访问服务器安全规范
2018-01-03 00:00
183 查看
一、安全规范
1:把当前时间戳加入请求GET参数,字段名为_time
2:把公钥加入请求GET参数,字段名为_ak
3:把所有需要传递的参数的key按字母顺序进行排序(升序),空的参数不参与校验
4:排序所参数拼接成请求的字符串,如_ak=abcde&_time=2343243&key1=%E5%8F%82%E6%95%B02&key2=%E5%8F%82%E6%95%B01
5:把第三步所的字符串与_sk链接在一起作md5,生成的字符串加到_sign参数里,一并传到服务器
注意:
1: 所有字符采用utf8编码
2: 参数必须先进行urlencode,再md5
3:只对GET内的参数做签名,签名参数附在url后面传递
1:把当前时间戳加入请求GET参数,字段名为_time
2:把公钥加入请求GET参数,字段名为_ak
3:把所有需要传递的参数的key按字母顺序进行排序(升序),空的参数不参与校验
4:排序所参数拼接成请求的字符串,如_ak=abcde&_time=2343243&key1=%E5%8F%82%E6%95%B02&key2=%E5%8F%82%E6%95%B01
5:把第三步所的字符串与_sk链接在一起作md5,生成的字符串加到_sign参数里,一并传到服务器
注意:
1: 所有字符采用utf8编码
2: 参数必须先进行urlencode,再md5
3:只对GET内的参数做签名,签名参数附在url后面传递
package com.android.deskclock.utils; import android.text.TextUtils; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.SortedSet; import java.util.TreeSet; /** * Tool to get signed request of letv server. * */ public class LeSignature { private static final String KEY_TIME ="_time"; private static final String KEY_AK = "_ak"; private static final String PARAMS_SEP = "&"; private static final String REQUEST_CHARSET = "UTF-8"; private static final char HEX_DIGITS[] = "0123456789abcdef".toCharArray(); private static String toHexString(byte[] bytes) { StringBuilder sb = new StringBuilder(bytes.length * 2); for (byte b : bytes) { sb.append(HEX_DIGITS[(b & 0xf0) >>> 4]); sb.append(HEX_DIGITS[b & 0x0f]); } return sb.toString(); } private static String join(Iterable<String> strings, String sep) { StringBuilder sb = new StringBuilder(); boolean first = true; for (String item : strings) { if (first) { first = false; } else { sb.append(sep); } sb.append(item); } return sb.toString(); } /** * Get sign string of request params. * <p> * See <code>http://wiki.letv.cn/pages/viewpage.action?pageId=37325204</code> * * @param accessKey Access key of client. * @param secretKey Secret key of client. * @param params Params of request. * @param time Current timestamp. * @return Result of sign */ public static String getSignature(String accessKey, String secretKey, Map<String, String> params, long time) { if (isEmpty(accessKey) || isEmpty(secretKey)) { throw new IllegalArgumentException("You MUST set access key and secret key for the request!"); } SortedSet<String> set = new TreeSet<String>(); try { set.add(KEY_TIME + "=" + URLEncoder.encode(String.valueOf(time), REQUEST_CHARSET)); set.add(KEY_AK + "=" + URLEncoder.encode(accessKey, REQUEST_CHARSET)); if (params != null && params.size() > 0) { for (String param : params.keySet()) { String value = params.get(param); if (!TextUtils.isEmpty(value)) { set.add(param + "=" + URLEncoder.encode(value, REQUEST_CHARSET)); } } } String paramsString = join(set, PARAMS_SEP); String str2Sign = paramsString + secretKey; MessageDigest digest = MessageDigest.getInstance("MD5"); digest.update(str2Sign.getBytes(REQUEST_CHARSET)); return toHexString(digest.digest()); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } return ""; } /** * Get sign string of request params and body. * <p> * See <code>http://wiki.letv.cn/pages/viewpage.action?pageId=37323874</code> * * @param accessKey Access key of client. * @param method Method of request, liking POST, GET etc. * @param path Path of request, for example "/api/v1/message". * @param body Body of request. * @param time Current timestamp. * @param params Params of request. * @return Result of sign */ public static String getSignature(String accessKey, String method, String path, byte[] body, long time, Map<String, String> params) { if (isEmpty(accessKey)) { throw new IllegalArgumentException("You MUST set access key for request!"); } try { String bodyMD5 = ""; if (body != null && body.length != 0) { MessageDigest digest; digest = MessageDigest.getInstance("MD5"); digest.update(body); bodyMD5 = toHexString(digest.digest()); } String paramString = ""; if (params != null && params.size() > 0) { SortedSet<String> set = new TreeSet<String>(); for (String param : params.keySet()) { String value = params.get(param); if (!TextUtils.isEmpty(value)) { set.add(param + "=" + value); } } paramString = join(set, PARAMS_SEP); } SimpleDateFormat fm=new SimpleDateFormat("EEE, d MMM yyyy hh:mm:ss z"); String date = fm.format(new Date(time)); String stringToSign = method.toUpperCase() + "\n" + path + "\n" + bodyMD5 + "\n" + date + "\n" + paramString; SecretKeySpec signingKey = new SecretKeySpec(accessKey.getBytes(), "HmacSHA1"); Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signingKey); byte[] rawHmac = mac.doFinal(stringToSign.getBytes()); return toHexString(rawHmac); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } catch (InvalidKeyException e) { e.printStackTrace(); } return ""; } private static boolean isEmpty(CharSequence str) { return (str == null || str.toString().trim().length() == 0); } }
相关文章推荐
- SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configur
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 s
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。
- [轻微]WEB服务器启用了OPTIONS方法/如何禁止DELETE,PUT,OPTIONS等协议访问应用程序/tomcat下禁用不安全的http方法
- sqlserver 服务器主体 无法在当前安全上下文下访问数据库
- 错误提示之:SQL—无法在服务器上访问指定的路径或文件。请确保您具有必需的安全权限且该路径或文件存在。
- 服务器无法访问应用程序目录。该目录不存在或因为安全设置而无法访问。
- 服务器无法访问应用程序目录。该目录不存在或因为安全设置而无法访问。
- SharePoint 2010 您可能试图从服务器上的安全浏览器访问此网站。请启用脚本然后重新加载此页。
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用
- SQL Server 阻止了对组件 'Agent XPs' 的 过程 'dbo.sp_set_sqlagent_properties' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。
- MySQL服务器内部安全数据目录如何访问
- windows 服务器安全之磁盘访问权限设置[完整篇]
- 解决方案: sqlserver 2008登陆时, 出现服务器主体 "xxxcom" 无法在当前安全上下文下访问数据库 "db_xxx_com"。
- MSSQL 服务器主体 无法在当前安全上下文下访问数据库,错误:916
- 通过配置ASA穿越代理加强企业内部访问服务器安全
- 利用https安全访问web的服务器搭建
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用 'Ad Hoc Distributed Queries'。有关启用 'Ad Hoc Distributed Que
- SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configur
- sqlserver 服务器主体 无法在当前安全上下文下访问数据库