java实现SHA1签名加密
2016-04-07 18:44
387 查看
公司需要开发一个对外接口API,需要用到SHA1安全哈希算法,具体需求如下:
Sign计算规则:
参数示例:
identityType:1Sign计算规则:
参数示例:
identityType:1
identityValue:440901197709194316
month:201601
1. 将参数与secret一起根据参数名进行字典排序,然后按照排序后顺序将参数名与参数值依次拼接成字符串
若secret:B6F74A83BACF97D5AC24AE6573A4C8AA703F98D9,则拼接的字符串为:
appKey2582535051identityType1identityValue440901197709194316month201601secretB6F74A83BACF97D5AC24AE6573A4C8AA703F98D9
2.对拼接字符串使用sha1算法得到长度40字符串,并转换为大写得到sign:
CEF10F6E922E976E462C18BF35E7CA3F23088B83
SHA1算法实现及详解,请参看博客http://blog.csdn.net/dingwood/article/details/7506620
现将需求实现代码写下:
public class Sha1 { /** * SHA1 安全加密算法 * @param maps 参数key-value map集合 * @return * @throws DigestException */ public static String SHA1(Map<String,Object> maps) throws DigestException { //获取信息摘要 - 参数字典排序后字符串 String decrypt = getOrderByLexicographic(maps); try { //指定sha1算法 MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.update(decrypt.getBytes()); //获取字节数组 byte messageDigest[] = digest.digest(); // Create Hex String StringBuffer hexString = new StringBuffer(); // 字节数组转换为 十六进制 数 for (int i = 0; i < messageDigest.length; i++) { String shaHex = Integer.toHexString(messageDigest[i] & 0xFF); if (shaHex.length() < 2) { hexString.append(0); } hexString.append(shaHex); } return hexString.toString().toUpperCase(); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); throw new DigestException("签名错误!"); } } /** * 获取参数的字典排序 * @param maps 参数key-value map集合 * @return String 排序后的字符串 */ private static String getOrderByLexicographic(Map<String,Object> maps){ return splitParams(lexicographicOrder(getParamsName(maps)),maps); } /** * 获取参数名称 key * @param maps 参数key-value map集合 * @return */ private static List<String> getParamsName(Map<String,Object> maps){ List<String> paramNames = new ArrayList<String>(); for(Map.Entry<String,Object> entry : maps.entrySet()){ paramNames.add(entry.getKey()); } return paramNames; } /** * 参数名称按字典排序 * @param paramNames 参数名称List集合 * @return 排序后的参数名称List集合 */ private static List<String> lexicographicOrder(List<String> paramNames){ Collections.sort(paramNames); return paramNames; } /** * 拼接排序好的参数名称和参数值 * @param paramNames 排序后的参数名称集合 * @param maps 参数key-value map集合 * @return String 拼接后的字符串 */ private static String splitParams(List<String> paramNames,Map<String,Object> maps){ StringBuilder paramStr = new StringBuilder(); for(String paramName : paramNames){ paramStr.append(paramName); for(Map.Entry<String,Object> entry : maps.entrySet()){ if(paramName.equals(entry.getKey())){ paramStr.append(String.valueOf(entry.getValue())); } } } return paramStr.toString(); }
相关文章推荐
- 构建项目Maven+SpringMVC+Spring+Mybatis
- javaweb-四则运算
- 利用jdk 工具构建webservice 的server 和 client
- #2JAVA面向对象之封装#
- 获取Web项目路径
- spring-jms/DefaultMessageListenerContainer配置
- Java基础学习第一天——JVM简介与环境变量配置
- JAVA 获取进程PID
- java 打开本地程序
- spring+spring mvc +mybatis+druid 实现数据库主从分离
- Java实现插入排序之希尔排序
- Ubuntu安装pycharm, No JDK found. Please validate either PYCHARM_JDK, JDK_HOME or JAVA_HOME environment variable points to valid JDK installation
- JAVA学习路线总结
- 升级java1.8及ssh版本中碰到的问题(三)
- Java I/O 系统-File类(一)-文件及其内容过滤
- Java对象的强、软、弱和虚引用
- 160407、java实现多线程同步
- SSH框架搭建步骤(笔记)
- Java内存溢出详解及配置
- java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 解决方法