zoukankan      html  css  js  c++  java
  • SHA安全散列算法简析

    1 SHA算法简介

    1.1 概述

      SHA (Secure Hash Algorithm,译作安全散列算法) 是美国国家安全局 (NSA) 设计,美国国家标准与技术研究院(NIST) 发布的一系列密码散列函数。正式名称为 SHA 的家族第一个成员发布于 1993年。然而人们给它取了一个非正式的名称 SHA-0 以避免与它的后继者混淆。两年之后, SHA-1,第一个 SHA 的后继者发布了。 另外还有四种变体,曾经发布以提升输出的范围和变更一些细微设计: SHA-224, SHA-256, SHA-384 和 SHA-512 (这些有时候也被称做 SHA-2)。

      SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1在许多安全协定中广为使用,包括TLSSSLPGPSSH、S/MIME和IPsec,曾被视为是MD5(更早之前被广为使用的杂凑函数)的后继者。但SHA-1的安全性如今被密码学家严重质疑;虽然至今尚未出现对SHA-2有效的攻击,它的算法跟SHA-1基本上仍然相似;因此有些人开始发展其他替代的杂凑算法。

    1.2 SHA算法原理

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

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

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

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

    1.3 SHA算法应用

      SHA算法主要用于被政府部门和私营业主用来处理敏感的信息。例如,支付机构,银行之间的数据传输,有的是使用SHA散列算计进行加密。

    2 java代码实现SHA算法

     1 package cn.mars.app.txn.wanglian;
     2 
     3 import java.security.MessageDigest;
     4 import java.security.NoSuchAlgorithmException;
     5 
     6 public class Sha1Util {
     7     /**
     8      * SHA1签名
     9      * @param paramStr 要加签的字符串
    10      * @return
    11      */
    12     public static String SHA1(String paramStr) {
    13         MessageDigest alg;
    14         String result = "";
    15         String tmp = "";
    16         try {
    17             alg = MessageDigest.getInstance("SHA-1");
    18             alg.update(paramStr.getBytes());
    19             byte[] bts = alg.digest();
    20 
    21             for (int i = 0; i < bts.length; i++) {
    22                 tmp = (Integer.toHexString(bts[i] & 0xFF));
    23                 if (tmp.length() == 1)
    24                     result += "0";
    25                 result += tmp;
    26             }
    27         } catch (NoSuchAlgorithmException e) {
    28             // TODO Auto-generated catch block
    29             e.printStackTrace();
    30         }
    31 
    32         return result;
    33     }
    34     
    35     public static void main(String[] args) {
    36         String sha1 = SHA1("111");
    37         
    38         System.out.println(sha1);
    39     }
    40 }

    参考:

      1、http://blog.csdn.net/qq_32714913/article/details/50358204

      2、https://baike.baidu.com/item/SHA/9533316

  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/xq1314/p/7889688.html
Copyright © 2011-2022 走看看