SHA1

编辑

安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。 SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要,(但会有1x10 ^ 48分之一的机率出现相同的消息摘要,一般使用时忽略)。

术语和概念

编辑

位,字节和字

SHA1始终把消息当成一个位(bit)字符串来处理。本文中,一个字(Word)是32位,而一个字节(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串: 0x616263.

运算符和符号

下面的逻辑运算符都被运用于“字”(Word)
X & Y = X, Y逻辑与
X | Y = X, Y逻辑或
X ^ Y= X, Y逻辑异或
~X = X逻辑取反
X+Y定义如下:
字 X 和 Y 代表两个整数 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整数z = (x + y) mod 2^32. 这时候 0 <= z < 2^32. 将z转换成字Z, 那么就是 Z = X + Y.
逻辑左移位(循环移位)操作符Sn(X):
X是一个字,n是一个整数,0<=n<=32。
Sn(X) = (X<<n)OR(X>>32-n)

SHA1算法描述

编辑

在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:
01100001 01100010 01100011
―――――――――――――
‘a’=97 ‘b’=98 ‘c’=99
这个位字符串的长度为24。下面我们需要5个步骤来计算消息摘要MAC。

补位

消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。
补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位的过程。
原始信息: 01100001 01100010 01100011
补位第一步:01100001 01100010 01100011 1
首先补一个“1”
补位第二步:01100001 01100010 01100011 10…..0
然后补423个“0”
我们可以把最后补位完成后的数据用16进制写成下面的样子
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000
经过以上的处理之后,数据的长度是448了,我们可以进行下一步操作。

补长度

所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)
61626380 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000018
如果原始的消息经过补位后长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。

使用的常量

一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出。它们如下:
Kt = 0x5A827999 (0 <= t <= 19)
Kt = 0x6ED9EBA1 (20 <= t <= 39)
Kt = 0x8F1BBCDC (40 <= t <= 59)
Kt = 0xCA62C1D6 (60 <= t <= 79).

使用的函数

在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义
ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)
ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)
ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)
ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).

计算消息摘要

必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。第二个5个字的缓冲区被标识为H0, H1, H2, H3, H4
。80个字的缓冲区被标识为W0, W1,..., W79
另外还需要一个一个字的TEMP缓冲区。
为了产生消息摘要,在第3.2部分中定义的512位(16个字)的数据块M1, M2,..., Mn
会依次进行处理,处理每个数据块Mi 包含80个步骤。
在处理所有数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)
H0 = 0x67452301
H1 = 0xEFCDAB89
H2 = 0x98BADCFE
H3 = 0x10325476
H4 = 0xC3D2E1F0.
现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤
(1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字
(2). 对于 t = 16 到 79 令
W[t] = S1(W[t-3] XOR W[t-8] XOR W[t-14] XOR W[t-16]).
(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.
(4) 对于 t = 0 到 79,执行下面的循环
TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;
E = D; D = C; C = S30(B); B = A; A = TEMP;
(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.
在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识
H0 H1 H2 H3 H4.
对于SHA256,SHA384,SHA512。你也可以用相似的办法来计算消息摘要。对消息进行补位的算法完全是一样的。
SHA1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。

在安卓开发的过程中,我们通常都可能要用到sha1,比如,在申请第三方开发的过程中,比如高德地图sdk,百度地图sdk...,获取第三方专属的key,都需要sha1,那么,如何获取签名的sha1值了,这里我简要列举俩种方式,一种是通过代码获取,另一种是通过签名工具keystore来获取。

方式一:代码方式,直接上代码。

public class Sha1Utils {//这个是获取SHA1的方法
    public static String getCertificateSHA1Fingerprint(Context context) {//获取包管理器
        PackageManager pm = context.getPackageManager();
        //获取当前要获取SHA1值的包名,也可以用其他的包名,但需要注意,
        //在用其他包名的前提是,此方法传递的参数Context应该是对应包的上下文。
        String packageName = context.getPackageName();
        //返回包括在包中的签名信息
        int flags = PackageManager.GET_SIGNATURES;
        PackageInfo packageInfo = null;
        try {//获得包的所有内容信息类
            packageInfo = pm.getPackageInfo(packageName, flags);
        } catch (PackageManager.NameNotFoundException e) {e.printStackTrace();
        }//签名信息
        Signature[] signatures = packageInfo.signatures;
        byte[] cert = signatures[0].toByteArray();
        //将签名转换为字节数组流
        InputStream input = new ByteArrayInputStream(cert);
        //证书工厂类,这个类实现了出厂合格证算法的功能
        CertificateFactory cf = null;
        try {cf = CertificateFactory.getInstance("X509");
        } catch (Exception e) {e.printStackTrace();
        }//X509证书,X.509是一种非常通用的证书格式
        X509Certificate c = null;
        try {c = (X509Certificate) cf.generateCertificate(input);
        } catch (Exception e) {e.printStackTrace();
        }String hexString = null;
        try {//加密算法的类,这里的参数可以使MD4,MD5等加密算法
            MessageDigest md = MessageDigest.getInstance("SHA1");
            //获得公钥
            byte[] publicKey = md.digest(c.getEncoded());
            //字节到十六进制的格式转换
            hexString = byte2HexFormatted(publicKey);
        } catch (NoSuchAlgorithmException e1) {e1.printStackTrace();
        } catch (CertificateEncodingException e) {e.printStackTrace();
        }return hexString;
    }//这里是将获取到得编码进行16进制转换
    private static String byte2HexFormatted(byte[] arr) {StringBuilder str = new StringBuilder(arr.length * 2);
        for (int i = 0; i < arr.length; i++) {String h = Integer.toHexString(arr[i]);
            int l = h.length();
            if (l == 1)h = "0" + h;
            if (l > 2)h = h.substring(l - 2, l);
            str.append(h.toUpperCase());
            if (i < (arr.length - 1))str.append(':');
        }return str.toString();
    }
}

通过,调用以上的工具类,可以得到我们当前应用的sha1

方式二:签名工具查看

在开发每一个应用的时候,我们都需要对应用前行签名,如何签名,这里不做纤细说明,就是利用keystory文件生成对应的签名证书。

第一步:cd到签名文件目录下

第二步:执行 keytool -list -v –keystore“签名文件”命令

第三步:直接回车,输入秘钥即可,通常,秘钥是签名文件的key_pass.

成功后,会看见下面的提示:

CA:E4:0D:47:15:F9:FD:CC:5A:F0:F5:F6:B1:AD:3E:FD:2B:4B:C8:FE

Android代码查看sha1值相关推荐

  1. linux系统下idea打包apk教程,intellij idea14打包apk文件和查看sha1值

    "深入浅出,人人都是程序员" 开发过android手机的同学都知道在eclipse中可以直接查找到SHA1值,但是使用intellij idea的同学则找不到SHA1值,所以就有了 ...

  2. Android studio 查看sha1

    高德地图开发申请KEY的时候需要开发者提供SHA1证书指纹数据,在eclipse很容易就找到了,但是Android Studio很久也没找到,只能使用在网上看到的方法了,在Android Studio ...

  3. android studio 获取SHA1值 MD5值

    运行CMD 输入 cd .android  回车 输入 keytool -list -v -keystore D:/yohoo.keystore -storepass android  回车 D:/y ...

  4. android 签名文件与sha1获取

    签名与sha1 获取 1.签名作用: 一个Android项目可以以它的包名作为唯一标识符,但是手机上的应用可能不止这一个应用,如果手机上有两个应用恰好使用了同一个包名,那么其中一个应用程序就会覆盖另一 ...

  5. 转载记录:android 手动生成jks及查看jks的SHA1值

    在Android studio 的Terminal里操作输入 1.手动生成.jks文件 keytool -genkey -alias test -keypass 123456 -keyalg RSA ...

  6. 《Android studio 创建生成keystore SHA1值的申请 高德地图key值申请 android studio 打包生成apk》

    开发背景:目前做车载项目,领导要求用高德地图.整理了一下,差不多就是下面的目录: 一.创建生成keystore: 二.SHA1值的申请: 三.高德地图key值申请: 四.android studio ...

  7. android 开发工具—AndroidStudio获取SHA1值

    文章链接:http://crazyandcoder.github.io/ github: https://github.com/crazyandcoder 在使用高德地图时,申请key需要用到apk的 ...

  8. Android获取SHA1值

    前言 获取SHA1.256值是老生常谈问题,当我们需要用到百度地图等三方技术时,需要我们提供相关信息用以注册,目前关于如何获取SHA1.256网上有很多帖子,我也再写一遍,末尾会新增一个傻瓜式方法 一 ...

  9. Android输出签名的 SHA1 值

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/105341708 本文出自[赵彦军的博客] 方式一:使用 gradle 命令 ./g ...

最新文章

  1. 揭秘深度强化学习的研究哲学:乐观主义与悲观主义
  2. python计算出nan_python如何进行汇总统计?
  3. 第二阶段个人博客总结8
  4. JDBC 程序的常见错误及调试方法
  5. linux获取ip地址的接口,获取Linux上接口的IP地址
  6. hive中导入text文件遇到的坑
  7. 马尔科夫过程与吉布斯采样
  8. jQuery-ui源代码重点难点分析
  9. 【python、pyqt5】,打包出现的若干问题
  10. 【Scratch案例实操】scratch大鱼吃小鱼(完整详案) scratch编程案例教学 scratch创意编程 少儿编程教案
  11. 统计学中抽样调查和一些常用的方法
  12. OpenGL(十三) Alpha测试、剪裁测试
  13. ML Hyperlink
  14. fiddler+LR11录制脚本
  15. 如何将谷歌卫星地图转成80坐标并测量面积
  16. IS-IS LSDB详解(华为设备)
  17. FireBox与Chrome,FireBox 对代码执行严格
  18. springboot手写JDBC面对2000并发量毫无压力
  19. 狂神redis笔记_狂神说redis笔记(三)
  20. PR时间轴模板 企业发展融资历程PR动态图形模板MOGRT

热门文章

  1. ​2019年最新 BAT 美团头条面试题目及答案汇总
  2. 怎么看电脑能不能升级win10系统|检测电脑适不适合安装win10的方法
  3. linux TUN 虚拟网卡设备
  4. 运用Parcelable将类序列化并绑定给Intent
  5. Hadoop1.0.4单节点StandAlone及Pseudo-Distributed部署方法
  6. 中国的房子其实是不断贬值的
  7. python基本数据类型第三周_python3第二天(基本数据类型)
  8. 小红书被曝裁员 先从试用期员工开始
  9. 国家邮政局:前10月邮政行业业务收入同比增长17.8%
  10. SK海力士收购英特尔NAND闪存业务已获韩国公平贸易委员会批准