dhv-ll什么牌子(关于加解密、加签验签的那些事)

作者:不要向无数程序员学习

面对MD5,SHA,DES,AES,RSA等等是不是有很多问号?这些名词是什么?还有其他的公钥加密、私钥解密、私钥签名和公钥验证。这到底是什么?也许你在日常工作中没有听说过这些名词,但是一旦你要设计一个外部访问接口或者安全性要求很高的系统,你就不可避免的会接触到这些名词。所以加密解密,签名验证,签名验证是一个合格的程序员必须掌握的概念。那么与加密解密相关的密码学真的离我们很远吗?其实生活中有很多常见的场景其实都用到密码学的相关知识。我们不要想太多。比如《睡在我上铺的兄弟》这一段,小皮条客代表A,小红人代表B,哦,我的天代表C,坑爹是d,这段绕口令其实是一种密码术。所以密码学与我们的生活息息相关,接下来我们会透彻理解这些概念。

没有硝烟的战场——谈密码学

没有地基也许可以建一个小屋,但绝对不可能建一个坚固的建筑。

密码这个词有很多种解释。现代社会,如果不接触编程,一般认为是我们设置的登录密码或者去银行取钱时输入的数字。我们注册的时候为服务提供商存储了一组数字,以后登录的时候用这组数字来证明自己的身份。这个数字通常被称为密码。

我们需要知道的不是上面所说的密码,而是一种“密码学”,即将传输的信息按照一定的规则进行转换,从而隐藏信息的内容。这种方法可以使机密信息在公开渠道中传输而不泄漏。使用这种方法,你必须经历加密过程。在加密过程中,我们需要了解以下概念:

  • 原文:或者说明文,也就是隐字。
  • 加密:指隐藏原文的规则。
  • 密文:或称伪文本,是指按照加密方法对原文进行处理后生成的可公开传输的文本。
  • 密钥:加密的决定性因素可能是数字、词汇、某些字母或者这些东西的组合。
  • 加密的结果生成密文。如果接收方能够读取密文,就要告诉接收方加密的方法和密钥。否则接收方无法解密密文,无法读取原文。

    从历史上看,密码学可以分为两个阶段:古典密码学和现代密码学。两者的分界点是现代信息技术的诞生,现在讨论的密码学大多是指后者,是基于信息论和数学成果的。

    经典密码学

    古典密码学起源于几千年前,早在公元前1900年左右的古埃及,就出现了通过使用特殊字符和简单的替代密码来保护信息。在美索不达米亚平原上,曾出土过一块公元前1500年左右的泥板,上面记录着用加密方式描述的陶瓷上釉工艺配方。古希腊(公元前800-146年)发明了“隐写术”,用物理手段隐藏信息,比如用牛奶写字,用蜡覆盖文字。后来在古罗马,出现了基于替代加密的凯撒密码。据说凯撒用这种方法和部下交流,并以此命名。这些手段大多使用简单的机械工具来保护秘密,这在今天无疑是非常简单和容易猜测的。严格来说,可能很难称之为密码学。

    凯撒的密码是,当偏移量为3时,所有字母A都会被D代替,B变成E,以此类推。



    吉米·金·朱姆

    现代密码学

    现代密码学的研究来源于第一次世界大战和第二次世界大战对军事通信的保护和猜测的需求。1901年12月,意大利工程师古列尔莫·马可尼(Quariamo Marconi)成功完成了跨越大西洋的无线电通信实验,引起了世界范围的轰动,推动了无线电通信时代的到来。无线电极大地提高了远距离通信的能力,但它有一个天然的缺陷——很难限制接收方,这意味着你传输的信息可能会被截获,从而催生了加密技术的发展。

    无线电信息的加密和解密也直接促进了现代密码学和计算机技术的出现。反过来,这些科技进步也影响了时代的发展。第一次世界大战期间,德国外长阿瑟·齐默尔曼(Arthur Zimmermann)哄墨西哥结成反美军事同盟的电报(1917年1月16日)被英国情报局第40号办公室破译,直接导致美国参战。德国在二战中使用的英格玛密码机(当时最先进的加密设备)被盟军成功破译(1939-1941),导致德国在大西洋战役中战败。据说二战期间仅英国就有7000人从事密码学研究,他们的成果将二战结束时间至少提前了一到两年。

    接下来是可以称之为密码学历史上的一个里程碑。1945年9月1日,克劳德·艾尔伍德·香农完成了划时代的内部报告《密码学的数学理论》,1949年10月。该报告正式发表在《贝尔系统技术杂志》上,题目是《秘密系统的通信理论》。本文首次将密码学与信息论联系起来,为对称密码学提供了数学基础。这也标志着现代密码学的正式建立。这也是密码学史上第一个里程碑式的事件。

    密码学发展史上的第二个里程碑事件是DES的出现。DES称为数据加密标准,是一种使用密钥加密的分组密码算法。1977年,它被美国联邦政府的国家标准局确定为联邦数据处理标准(FIPS),并被授权用于非机密的政府通信。随后,该算法在国际上广泛传播。

    密码学发展史上的第三个里程碑事件是我们区块链广泛使用的公钥密码学,即非对称密码算法的出现。1976年11月,惠特菲尔德·迪菲(Whitfield Diffie)和马丁·E·赫尔曼(Martin E.Hellman)在IEEE Transactions on Information Theory上发表了一篇论文《密码学的新方向》(New Directions in Cryptography),讨论了无传输密钥的安全通信和签名认证系统,正式启动了现代公钥密码系统的研究。在发现公钥密码之前,如果需要保密通信,通信双方要事先协商好加解密算法和要使用的密钥,包括鸡毛发信,实际上就是在传输密钥。但是,有了公钥密码,需要秘密通信的双方不再需要事先协商密钥。公钥理论上不保密,实际上是保密的。也就是说,公钥密码是可以猜到的,但是需要非常长的时间。当它被猜测的时候,没有必要保守秘密的秘密。


    我们讲过现代密码学,基本上总结出来常用的加密算法有两种,一种是对称加密算法,一种是非对称加密算法。那么我们就以这两个概念为主线,引出开题中提到的概念。

    程序实现

    对称加密算法

    对称加密是指加密和解密使用相同的密钥,因此称为对称加密。对称加密只有一个密钥作为私钥。具体算法有:DES,3DES,TDEA,Blowfish,RC5,IDEA。但是我们有常见的:DES,AES等等。

    那么对称加密有什么优势呢?算法开放,计算量小,加密速度快,加密效率高。缺点是密钥的管理和分发非常困难,并且不够安全。在数据传输之前,发送方和接收方必须就密钥达成一致,然后双方必须保存密钥。如果一方的密钥泄露,加密的信息就不安全。此外,每一对用户在使用对称加密算法时都需要使用一个别人不知道的唯一密钥,这将使得接收方和发送方拥有的密钥数量巨大,密钥管理也将成为双方的负担。

    加密过程可以理解如下:

  • 加密:原始+密钥=密文
  • 解密:密文-密钥=原件
  • 可以看出,两个过程都使用秘密密钥。图表简单显示如下:



    战斗演习

    现在我们知道了对称加密算法,那么我们每天是如何用Java实现对称加密的加解密动作的呢?常见的对称加密算法有DES、AES等。

    DES

    DES加密算法是一种分组密码,以64位为一组对数据进行加密。其密钥长度为56位,加密和解密使用相同的算法。DES加密算法是保持秘密的密钥,而公开算法包括加密和解密算法。这样,只有与发送方拥有相同密钥的人才能读取用DES加密算法加密的密文数据。所以解密DES加密算法实际上就是搜索密钥的编码。对于56位长的密钥,如果用穷举法搜索,运算次数是2的56次方。

    接下来,用Java实现DES加密。

    1私有最终静态字符串DES = & # 34德斯& # 34;; 2 3 public static void main(String[]args)抛出异常{ 4 String data = & # 34;123 456"; 5 String key = & # 34;王!@#$"; 6 system . err . println(encrypt(data,key)); 7 system . err . println(decrypt(encrypt(data,key),key)); 8 9 } 10 11/* * 12 *描述是根据键值加密的 13 * @ param data 14 * @ param key加密密钥字节数组[@ return 16 * @ throws Exception 17 */ 18 public static String encrypt(String data,String key)抛出异常{ 19 byte[] bt 20 String strs = new base64 encoder()。编码(Bt); 21个返回strs 22 } 23 24/* 25 *描述根据密钥值解密 26 * @ param data 27 * @ param key加密密钥字节数组 28h/]29 * @ throws IOException 30 * @ throws Exception 31 */ 32公共静态字符串解密(字符串数据,字符串密钥)抛出io Exception, 36 base 64 decoder decoder = new base 64 decoder(); 37 byte[]buf = decoder . decode buffer(data); 38 byte[] bt = decrypt(buf,key . getbytes()); 39返回新字符串(Bt); 40 } 41 42/* 43 *描述根据键值加密 44 * @ param data 45 * @ param key加密密钥字节数组 46h/]47 * @抛出异常 48 */ 49私有静态字节[]加密(字节[]数据,字节[]密钥)抛出异常{ 50// 52 53 //从原始key数据创建DESKeySpec对象 54 deskey spec DKS = new deskey spec(key); 55 56 //创建一个密钥工厂,并使用它将DESKeySpec转换为SecretKey对象 57 Secret key factory key factory = Secret key factory。GetInstance(des); 58 secret key secure key = key factory . generate secret(dks); 59 60 // Cipher对象实际完成加密操作 61 Cipher = Cipher . getinstance(des); 62 63 //用key初始化Cipher对象 64 Cipher . init(Cipher . encrypt _ mode,securekey,Sr); 65 66 return cipher . do final(data); 67 } 68 69 70/* * 71 *描述根据密钥值解密 72 * @ param data 73 * @ param key加密密钥字节数组@ return 75 * @抛出异常 76 */ 77私有静态字节[]解密(字节[]数据,字节[]密钥)抛出异常{ 80 81 //从原始key数据创建DESKeySpec对象 82 deskey spec DKS = new deskey spec(key); 83 84 //创建一个密钥工厂,并使用它将DESKeySpec转换为SecretKey对象 85 Secret key factory key factory = Secret key factory。GetInstance(des); 86 secret key secure key = key factory . generate secret(dks); 87 88 //密码对象实际完成解密操作 89密码=密码。GetInstance(des); 90 91 //初始化密码对象 92 Cipher . init(Cipher . decrypt _ mode,securekey,SR); 93 94 return cipher . do final(data); 95}输出后,可以看到数据被加密了。

    1fiw/xhrj0e = 2123 456在Java中有一个特殊的地方使用了DES加密。

  • 密钥设置的长度必须大于或等于8。
  • 如果密钥设置的长度大于8,则只将前8个字节作为密钥。
  • 为什么?我们可以看到初始化DESKeySpec类的时候有下面这段话,其中var1是我们传递的秘钥。你可以看到他拦截了它。仅截取前八个字节。

    1public DESKeySpec(byte[] var1,int var2)抛出InvalidKeyException { 2 if(var 1 . length-var 2 & lt;8) { 3抛出新的InvalidKeyException(& # 34;错误的密钥大小& # 34;); 4 } else { 5 this . key = new byte[8]; 6 System.arraycopy(var1,var2,this.key,0,8); 7 } 8}AESAES加密算法是密码学中的高级加密标准。该加密算法采用对称分组密码体制,最小支持密钥长度128,192,256,分组长度128位。该算法应该易于在各种硬件和软件中实现。这种加密算法是美国联邦政府采用的块加密标准。AES标准用来取代原来的DES,经过多方分析,在世界范围内广泛使用。

    dhv是什么牌子的啊

    JCE,Java密码扩展,在早期的JDK版本中,由于美国密码出口法规的限制,Java中涉及加密和解密功能的API被限制出口,所以Java中的安全组件被分为两部分:没有加密功能的JCA(Java Cryptography Architecture)和有加密功能的JCE(Java Cryptography Extension)。

    JCE的API都在javax.crypto包下,核心功能包括:加解密、密钥生成(对称)、MAC生成和密钥协商。

    加密和解密功能由密码组件提供,这也是JCE的核心组件。

    设置密码类时有几点需要注意:

  • Cipher在使用时需要指定transformation作为参数。
  • 转换的格式是算法/模式/填充,其中需要算法,比如AES/DES AES/DES/CBC/pkcs 5 padding。详情见下表。
  • 默认模式是ECB,默认填充是PKCS5Padding
  • 当块算法与流加密模式结合时,需要指定模式后每次处理的位数,如des/CFB 8/no padding。如果未指定,则使用默认值,SunJCE的默认值是64位。
  • Cipher有四种运行模式:ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE Key),UNWRAP_MODE需要在初始化时指定。







  • 密钥可以由我们自己定义,也可以由AES自己生成。当有必要定义自身时,我们应该注意:

  • 根据AES规范,可以是16字节、24字节、32字节长,分别对应128位、192位、256位;
  • 为了传输方便,加密数据一般采用base64编码:
  • 1 public static void main(string[]args)throws exception { 2/* 3 *此处使用AES-128-ECB加密模式,密钥需要16位。 4 */ 5 String cKey = & # 34;1234567890123456"; 6 //要加密的字符串 7字符串cSrc = & # 34补血武术& # 34;; 8 System.out.println(证监会); 9//encryption 10 string en string = encrypt(CSRC,ckey); 11 system . out . println(& # 34;加密的字符串是:& # 34;+en string); 12 13//Decrypt 14 string de string = Decrypt(en string,ckey); 15 system . out . println(& # 34;解密后的字符串是:& # 34;+DeString); 16 } 17 18//encryption 19 public static string encrypt(string ssrc,string skey)throw exception { 20 if(skey = = null){ Is Key空null & # 34;); 22返回null 23 } 24 //确定密钥是否为16位 25 if (sKey.length())!= 16){ 26 system . out . print(& # 34;密钥长度不是16位& # 34;); 27返回null 28 } 29 byte[]raw = skey . getbytes(& # 34;utf-8 & # 34;); 30 SecretKeySpec skeySpec = new SecretKeySpec(raw,& # 34;AES & # 34); 31 Cipher Cipher = Cipher . getinstance(& # 34;AES/ECB/pkcs 5添加& # 34;);//"算法/模式/补码模式& # 34; 32 cipher.init(Cipher。ENCRYPT_MODE,skeySpec); 33 byte[]encrypted = cipher . do final(ssrc . getbytes(& # 34;utf-8 & # 34;)); 34 35返回新的Base64()。encodeToString(加密);//这里用BASE64作为转码功能,也可以起到二次加密的作用。 36 } 37 38//decrypt 39 public static String decrypt(String ssrc,String sKey)throw exception { 40 try { 41//判断密钥是否正确 42IF(sKey = = null){ 43 system。out . print(& # 34;Key空是否为null & # 34); 44返回null 45 } 46 //确定密钥是否为16位 47 if (sKey.length())!= 16){ 48 system . out . print(& # 34;密钥长度不是16位& # 34;); 49返回null 50 } 51 byte[]raw = skey . getbytes(& # 34;utf-8 & # 34;); 52 SecretKeySpec skeySpec = new SecretKeySpec(raw,& # 34;AES & # 34); 53 Cipher Cipher = Cipher . getinstance(& # 34;AES/ECB/pkcs 5添加& # 34;); 54 cipher.init(Cipher。DECRYPT_MODE,skeySpec); 55 byte[]encrypted 1 = new Base64()。解码(sSrc);//先解密 56 try { 57 byte[]original = cipher。Dofinal(加密1); 58 String original String = new String(original,& # 34;utf-8 & # 34;); 59 return original string; 60 } catch(Exception e){ 61 system . out . println(e . tostring()); 62返回null 63 } 64 } catch(Exception ex){ 65 system . out . println(ex . tostring()); 66返回null 67 } 68}非对称加密算法

    非对称加密算法之所以称为非对称加密算法,是因为加密和解密不使用相同的密钥。在非对称加密算法中,每个用户有两个密钥,一个公钥和一个私钥。公钥向公众发布。每个人都可以看到每个人的公钥。私钥由他自己保管。每个人都只知道自己的私钥而不知道别人的。也正是在非对称加密算法中,才有了加解密、签名添加和签名验证的概念。接下来,我们来解释一下这些概念是什么意思。

    加密和解密

    用用户的公钥加密,只有用户的私钥可以解密。在这种情况下,公钥用于加密信息,确保只有特定的人(谁使用公钥就是谁)才能解密信息。所以这就是我们所说的加密解密

    我以A银行和小明为例。假设两者之间采用非对称加密算法,保证信息传输的安全性(第三方不会知道信息的含义而篡改)。流程大致如下:首先,小明给A银行发信息“我要存500元”。小明会根据A银行发布的公钥对这些信息进行加密,加密后会变成“XXXXXXX”发送给A银行,中间被第三方截获,没有A银行的私钥无法解密,无法知道信息的含义,也无法以正确的方式篡改。所以没有办法把这个加密的消息。最后被A银行接受,A银行用自己的私钥解密这个信息。解密成功,读取内容并执行操作。然后知道消息是小明发的,就去拿小明的公钥,用小明的公钥加密“操作成功(或失败)”的消息,发给小明。同理,小明用自己的私钥解开,得知了知乎发来的信息内容。其他人拦截是因为没有小明的私钥,所以没用。

    添加并检查

    第二种情况是用公钥来解密信息,这样才能保证别人知道这个信息真的是我发布的,是完整的,正确的。接收方可以知道这个信息确实来自拥有私钥的人,这个私钥叫做数字签名,公钥的形式是数字证书。所以这就是我们所说的贴附和验证

    继续以小明和A银行为例。A银行发布了银行客户端补丁,供所有用户更新。然后,为了保证人们下载的是正确完整的客户端,A银行会在这个程序上打上数字签名(也就是用A银行的私钥加密这个程序,然后公布)。你需要在电脑上安装A银行的数字证书(即银行发布的公钥),然后下载这个程序。数字证书会对这个程序的数字签名进行解密,解密成功,就可以使用补丁了。同时你可以知道这个补丁真的来自这个银行A,而且是他发布的,不是别人。

    战斗演习

    我们在开发过程中经常用到的非对称加密算法是RSA算法。接下来,我们用Java实现RSA算法。

    生成密钥

    第一部分是生成密钥。有许多方法可以生成密钥。这里我就介绍三个。

    1.命令行:openssl可用于生成公钥和私钥。

    -generate public key and private key OpenSSL genrsa-out key . PEM 1024 -out指定生成的文件,该文件包含公钥和私钥,因此可以加密或解密 1024。2.使用网站:在线生成非对称加密公钥和私钥对。

    3.使用代码:您可以指定生成的密钥的长度,最小值为512。

    1公共静态KeyPair buildKeyPair()抛出nosuchalgorithm exception { 2 final int keySize = 2048; 3 key pair generator key pair generator = key pair generator . getinstance(RSA _ ALGORITHM); 4 key pair generator . initialize(keySize); 5返回key pair generator . genkey pair(); 6}用密钥加密,可以进行加密操作。接下来介绍RSA的加密操作,只要把公钥和要加密的数据传进去就很简单了。

    1-encrypt 2 public static byte[]encrypt(public key public key,string message)throw exception { 3 cipher cipher = cipher . getinstance(RSA _ algorithm); 4 cipher.init(Cipher。ENCRYPT_MODE,公钥); 5 6 return cipher . do final(message . getbytes(UTF8)); 7}解密1-解密 2 Public static byte []Decrypt(私钥私钥,byte[]加密)throw exception { 3 cipher cipher = cipher . getinstance(RSA _ algorithm); 4 cipher.init(Cipher。解密_模式,私有密钥); 5 6 return cipher . do final(加密); 7} Signature 1/** 2 *使用RSA Signature 3 */[h/]4 Private static string with RSA(字符串内容,私钥私钥)throws exception { 5 Signature = Signature . getinstance . sha1 with RSA & # 34;); 6 signature . init sign(private key); 7 signature . update(content . getbytes(& # 34;utf-8 & # 34;)); 8 byte[]signed = signature . sign(); 9返回base64Encode(有符号); 10}校验码1/** 2 *使用RSA校验码 3 */[h/] 4不使用RSA的私有静态布尔校验码(字符串内容、公钥公钥、字符串符号)抛出异常{ 5 Signature Signature = Signature . getinstance(& # 34;SHA1WithRSA & # 34); 6 signature . init verify(public key); 7 signature . update(content . getbytes(& # 34;utf-8 & # 34;)); 8返回signature . verify(base64 decode(sign)); 9}签名和检查时需要传入一个数字签名标准。我们这里填SHA1WithRSA,意思是用SHA算法签名,用RSA算法加密。

    算法说明:SHA1算法汇总计算后,需要对计算后的汇总进行处理,而不是直接用RSA算法加密。要求将SHA1总结的数据压缩到20字节。在前面插入15个字节表示数据。所以结构如下。

    10(数据类型结构)21(总长度)30(数据类型)09(长度)06 05 2B 0E 03 02 1A 0500【具体数据类型不清楚——请专家指正】04(数据类型)14(长度)+SHA1签名数据最终由RSA加密。所以我们填XXXWithRSA,其中XXX代表用什么抽象算法进行签名。至于什么是抽象算法,后面会详细解释。

    称之为实验。

    1 public static void main(String[]args)引发异常{ 2 key pair key pair = build key pair(); 3 4 byte[]encrypt data = encrypt(key pair . getpublic(),& # 34;学不完的东西& # 34;); 5 6 system . out . println(string . format(& # 34;加密数据:% s & # 34base64 encode(encrypt data))); 7 8 system . out . println(string . format(& # 34;解密的数据:% s & # 34、新字符串(decrypt(keyPair.getPrivate()、encryptData)、UTF8)); 9 10字符串上下文= & # 34;有符号字符串& # 34;; 11 12 String sign = signWithRSA(context,key pair . get private()); 13 14 system . out . println(string . format(& # 34;生成的签名:% s & # 34,符号)); 15 16 Boolean checkSignWithRSA = checkSignWithRSA(context,keyPair.getPublic(),sign); 17 18 system . out . println(string . format(& # 34;验证的结果:% s & # 34,checksignwithrsa . tostring())); 19}输出是

    1加密数据:bi 8 B4 eqep+rnrhdaij 8 vvlnwkuibpjffmyzmexkuaagegzmpb 8 hamyign+rbukwezyjkd 0 fiooxv 26 yryqd 7 fdast/m 443 qqrerlxd qfscvvvj 9 G1 ynpzb 2 q/jiwqapoptypnngbmfki+R/6v 4d yt 3 ha 5 gniaumyzynhdd+/W+x8zymwiuus 63+77

    数据算法是密码学算法中非常重要的一个分支,它从所有数据中提取指纹信息,实现数据签名、数据完整性检查等功能。由于它的不可逆性,它有时被用来加密敏感信息。数据摘要算法也称为哈希算法或哈希算法。

    消息摘要算法的主要特点是加密过程不需要密钥,加密的数据无法解密。只有输入相同的明文数据,才能通过相同的消息摘要算法得到相同的密文。(摘要可以比作指纹,消息摘要算法是获取文件的唯一位置)

    特点

    无论输入消息有多长,计算出的消息摘要的长度总是固定的。一般只要输入的消息不一样,汇总后生成的汇总消息也会不一样。但是同样的输入总是会产生同样的输出。只能做正面的信息汇总,却无法从汇总中恢复任何信息,甚至根本找不到与原始信息相关的信息(不可逆)。

    好的摘要算法,没有人能发现“碰撞”或者极难发现,虽然“碰撞”肯定是存在的(碰撞是指不同的内容产生相同的摘要)。

    应用

    通常,消息的摘要被称为消息的指纹或数字签名。数字签名是一种确保信息完整性和不可否认性的方法。数据完整性是指接收端收到的消息必须是源端发送的消息,中间没有任何变化。信息的不可否认性意味着信息来源不能否认已经发送的信息。事实上,数字签名还可以用于识别(认证)信息源,即确定“信息源”是否是预期的通信伙伴。数字签名应该是唯一的,即不同消息的签名是不同的;同时,它还应该是不可伪造的,即不可能找到另一个消息并使其签名与现有消息的签名相同;还应该是不可逆的,即无法根据签名还原已签名消息的任何信息。这些特点正是消息摘要算法的特点,所以消息摘要算法适合作为数字签名算法

    有哪些具体的消息摘要算法?
  • CRC8,CRC16,CRC32: CRC(循环冗余校验)算法历史悠久,应用广泛,尤其是在通信领域。目前应用最广泛的算法是CRC 32算法,它产生一个4字节(32位)的校验值,通常是一个8位的十六进制数,如FA 12 CD 45。CRC算法的优势在于简单快速。严格来说,CRC应该叫数据校验算法,但它的功能和数据摘要算法类似,所以也作为测试的可选算法。
  • MD2、MD4、MD5:该算法家族应用广泛,尤其是MD5(Message-Digest Algorithm 5,Message Digest Algorithm Version 5),由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)于1992年提出。目前,它被广泛应用于数据完整性检查、数据(消息)摘要、数据加密等方面。MD2、MD4、MD5都生成16字节(128位)校验值,一般用32位十六进制数表示。MD2的算法很慢,但相对安全。MD4速度很快,但是安全性在下降。MD5比MD4更安全、更快。
  • 1.SHA256、SHA384和SHA 512: SHA512:SHA(安全散列算法)是由美国国家标准与技术研究所(NIST)制定的,该研究所是美国专门制定加密算法的标准机构。SHA系列算法的抽象长度分别为:SHA为20字节(160位),SHA256为32字节(256位),SHA384为48字节(384位),SHA512为64字节(512位)。由于SHA系列算法生成的数据摘要长度更长,更难碰撞,因此更安全。这将是未来数据抽象算法的发展方向。由于SHA系列算法的数据摘要长度较长,其运算速度与MD5相比相对较慢。
  • 里默德、巴拿马、泰格、阿德勒32等。RIEMD是Hans Dobbertin等人在分析MD4和MD5缺陷的基础上于1996年提出的。有四种标准128、160、256和320,它们对应的输出长度分别为16字节、20字节、32字节和40字节。TIGER是由Ross在1995年提出的。Tiger号称是最快的哈希算法,是专门针对64位计算机优化的。
  • 实战演练

    我们在单独使用总结算法的时候通常会用到MD5算法,所以这里我们会单独说明如何用Java实现MD5算法。

    1 public static string get MD 5 tstr(string str)throws exception { 2 try { 3//生成MD5加密计算摘要 4 messagedigest MD = message digest . getinstance(& # 34;MD5 & # 34); 5 //计算md5函数 6 MD . update(str . getbytes()); 7 // digest()最终决定返回md5哈希值,返回值为8为字符串。因为md5哈希值是一个16位的十六进制值,实际上是一个8位的字符 8 // BigInteger函数会将一个8位的字符串转换成16位的十六进制值,用字符串表示;获取哈希值 9返回新的大整数(1,md.digest())。字符串形式的tostring (16 ); 10 } catch(Exception e){ 11抛出新的异常(& # 34;MD5加密出错,& # 34;+e . tostring()); 12 } 13} 复制代码来源:掘金链接:https://juejin.im/post/5eba78e95188256d9f09656b

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友