Android数据加密之SHA安全散列算法

前言:

对于SHA安全散列算法,以前没怎么使用过,仅仅是停留在听说过的阶段,今天在看图片缓存框架Glide源码时发现其缓存的Key采用的不是MD5加密算法,而是SHA-256加密算法,这才勾起了我的好奇心,所以趁着晚上没啥事,来学习一下。

其他几种加密方式:

SHA加密算法

SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。和MD5加密算法一样,也是一种不可逆的加密算法,不过也可以通过穷举法破解,但是SHA的破译难度与成本要高于MD5,相对于MD5更加安全,现在已成为公认的最安全的散列算法之一,并被广泛使用。主要包括SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过2^64二进制位的消息。SHA-384和SHA-512适用于长度不超过2^128二进制位的消息。官方解说如下:

  • 由消息摘要反推原输入消息,从计算理论上来说是很困难的。
  • 想要找到两组不同的消息对应到相同的消息摘要,从计算理论上来说也是很困难的。任何对输入消息的变动,都有很高的机率导致其产生的消息摘要迥异。

SHA加密原理

SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性。SHA将输入流按照每块512位(64个字节)进行分块,并产生20个字节的被称为信息认证代码或信息摘要的输出。

该算法输入报文的长度不限,产生的输出是一个160位的报文摘要。输入是按512 位的分组进行处理的。SHA-1是不可逆的、防冲突,并具有良好的雪崩效应。

通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

MAC (信息认证代码)就是一个散列结果,其中部分输入信息是密码,只有知道这个密码的参与者才能再次计算和验证MAC码的合法性。

SHA加密优点

由于SHA也是有MD4演变过来的,所以其优点与MD5大致一样

  • 压缩性:任意长度的数据,算出的SHA值长度都是固定的。
  • 容易计算:从原数据计算出SHA值很容易。
  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的SHA值都有很大区别。
  • 强抗碰撞:已知原数据和其SHA值,想找到一个具有相同SHA值的数据(即伪造数据)是非常困难的。

SHA应用场景

  • 一致性验证
  • 数字签名
  • 安全访问认证

SHA加密的简单实现

这里代码演示以SHA-256为例。

    public static String sha(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("sha-256");
            byte[] bytes = md5.digest((string ).getBytes());
            String result = "";
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

SHA安全性探讨

  • SHA-1在许多安全协议中广为使用,包括TLS和SSL、PGP、SSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的散列函数)的后继者。2005年,密码学家就证明SHA-1的破解速度比预期提高了2000倍,虽然破解仍然是极其困难和昂贵的,但随着计算机变得越来越快和越来越廉价,SHA-1算法的安全性也逐年降低,已被密码学家严重质疑,希望由安全强度更高的SHA-2替代它。
  • SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2。
  • 新的散列函数并没有接受像SHA-1一样的公众密码社区做详细的检验,所以它们的密码安全性还不被大家广泛的信任。
  • 虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的散列算法。

跨国公司事迹:

Google官方博客宣布,将在Chrome浏览器中逐渐降低SHA-1证书的安全指示。但有意思的是Google.com目前使用的也是SHA-1签名的证书,但证书将在3个月内过期,Google将从2015年起使用SHA-2签名的证书。SHA-1算法目前尚未发现严重的弱点,但伪造证书所需费用正越来越低。

时间: 2024-12-21 00:43:36

Android数据加密之SHA安全散列算法的相关文章

数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)

数字签名是什么? 1. 鲍勃有两把钥匙,一把是公钥,另一把是私钥. 2. 鲍勃把公钥送给他的朋友们----帕蒂.道格.苏珊----每人一把. 3. 苏珊给鲍勃写信,写完后用鲍勃的公钥加密,达到保密的效果. 4. 鲍勃收信后,用私钥解密,看到信件内容. 5. 鲍勃给苏珊回信,写完后用Hash函数,生成信件的摘要(digest). 6. 然后,鲍勃使用私钥,对这个摘要加密,生成"数字签名"(signature). 7. 鲍勃将这个签名,附在信件下面,一起发给苏珊. 8. 苏珊收信后,取下数

对称密码、非对称密码、散列算法与PKI

对称密码.非对称密码.散列算法与PKI 密码学要解决的问题:机密性.完整性.身份验证(抗抵赖性): 一.对称密码: 对称密码技术:发件人和收件人使用其共同拥有的单个密钥 ,这种密钥既用于加密,也用于解密,叫做机密密钥(也称为对称密钥或会话密钥). 能够提供信息机密性(没有密钥信息不能被解密).完整性(被改变的信息不能被解密)的服务. 对称式密码学又称:单钥密码学.秘密密钥密码学.会话密钥密码学.私钥密码学.共享秘钥密码学  常见的对称式加密技术: DES(数据加密标准):分组式加密,算法源于Lu

MD5(单向散列算法)原理分析

注:本文章转载于网络. MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:    输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    不同的输入得到的不同的结果(唯一性):    根据128位的输出结果不可能反推出输入的信息(不可逆): MD5属不属于加密算法:    认为不属于的人是因为他们觉得不能从密文(散列值)反过来得到原文,即没有

加密散列算法——MD5

引用wiki的定义,散列函数(或散列算法,英语:Hash Function)是一种从任何一种数据中创建小的数字"指纹"的方法.该函数将数据打乱混合,重新创建一个叫做散列值的指纹.散列值通常用来代表一个短的随机字母和数字组成的字符串.好的散列函数在输入域中很少出现散列冲突.在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到.(具体专业术语请自行度娘) MD5是单向散列算法的一种,全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD

散列函数之单散列算法解决冲突问题

1. 问题 问题同<简单散列函数算法> 设有10个非负整数,用不多于20个的储存单元来存放,如何存放这10个数,使得搜索其中的某一个数时,在储存单元中查找的次数最少? 问题类似于,有10个带号码的球,放到编号为{0, 1, 2, -, 19}共20个盒子中,每个盒子最多放一个,问如何放,使能够用最少的次数打开盒子,知道任一个球所在的盒子编号? 2. 分析 <简单散列函数算法>中,已经分析得出,只要能解决冲突问题,就能将查找时间降为常量范围内. 思路:当一个数发生冲突时,再找一个没有

Java哈希散列算法简介 - MD5 &amp; SHA-512

Java哈希散列算法简介 - MD5 & SHA-512 在日常的开发工作中,我们常常会碰到这样的一个场景:我们需要有一种可靠的行之有效的方法来检验跟判断数据在传输过程当中的完整性.最常见的一种情况就是当我们传输文件的时候,由于网络故障或者其他的一些因素,可能会出现我们下载下来的文件不完整,这给我们日常的开发和维护带了一些难题:另外的一个较为常用的场景就是:有没有一种行之有效的方法让我们可以很方便的判断服务器上的文件是不是有最新的数据更新,比如我们现在的移动Hybird App开发,我们经常会发

个人理解c#对称加密 非对称加密 散列算法的应用场景

c#类库默认实现了一系列加密算法在System.Security.Cryptography; 命名空间下 对称加密 通过同一密匙进行加密和解密.往往应用在内部数据传输情况下.比如公司a程序 和B程序 .a程序要给B程序发送数据 但是为了防止明文发送 数据被窃取.那么我就定了一个协议传输的数据的byte字节都统一+1  而接收数据的情况下将Byte字节统一-1 然后就能获得正确的 数据(当然这个是一个简单的加密) ,真正应用的加密肯定比这个复杂很多 非对称加密 传输数据的双方有各自的公钥和私钥  

加解密算法一:散列算法、对称加解密

.Net中的加解密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以应先在程序中添加using System.Security.Cryptography. 1.散列算法: 用来产生一些数据片段(例如消息或会话项)的散列值的算法.好的散列算法具有在输入数据中的更改可以更改结果散列值中每个比特的特性:因此,散列对于检测在诸如消息等大型信息对象中的任何变化很有用.此外,好的散列算法使得构造两个独立的有相同散列的输入不能通过计算方法实现. 典型的散列算法包括 M

散列算法和哈希表结构

散列算法和哈希表结构 算法概述 Hash ,一般翻译做" 散列" ,也有直接音译为" 哈希" 的,就是把任意长度的输入(又叫做预映射, pre-image ),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不 同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值.简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数. 哈希表 数组的特点是:寻址容易,插入和删除困难: