消息摘要算法在Java Web系统中的应用
- 格式:pdf
- 大小:169.50 KB
- 文档页数:4
基于MD5的加盐消息摘要Java实现作者:赵一凡卞良丛昕来源:《软件导刊》2018年第03期摘要:Java是一种面向对象的编程语言,具有良好的跨平台性,其继承、封装、多态的特征能够使程序更加稳定。
通过对摘要破解网站的测试,发现短语言实现明文摘要加密,安全性并不高,而加盐消息摘要有助于提高加密安全性。
加盐消息摘要保留了MD5算法的优点,通过增加原始明文长度,可解决短明文摘要加密不安全的问题。
测试结果表明,加盐消息摘要的安全性较高,加盐后的消息摘要不易被破解网站反查询破解。
关键词:消息摘要;加盐法;MD5;加密DOIDOI:10.11907/rjdk.172368中图分类号:TP312文献标识码:A文章编号文章编号:16727800(2018)003021403英文摘要Abstract:Java is an object oriented programming language, has a good crossplatform,it’s inheritanc e, encapsulation, multistate features make the program more stable. Through testing the digest to crack the website, we found that the short text is encrypted in plain text is not safe. However, the method with salt can improve the security of the encryption. Salt method to retain the advantages of MD5 algorithm, by increasing the length of the original text to solve the short text summary encryption is not safe. Will be added after the message summary results into the abstract crack site. The results show that the safety of salt method is higher, and the message digest after salt is not easy to be cracked.英文关键词Key Words:message digest; method with salt; MD5; encryption0引言信息技术的快速发展,使资源获取变得越来越便捷,因此人们对身份和信息的完整性、保密性及信息的安全传输极为关注。
首先来看一下什么是国密算法:国密即国家密码局认定的国产密码算法,即商用密码。
国密主要有SM1,SM2,SM3,SM4。
密钥长度和分组长度均为128位。
1、SM1 为对称加密。
其加密强度与AES(高级加密标准,Advanced Encryption Standard)相当。
该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
2、SM2为非对称加密,基于ECC。
该算法已公开。
由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA。
ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
3、SM3为消息摘要。
可以用MD5作为对比理解。
该算法已公开。
校验结果为256位。
4、SM4为无线局域网标准的分组数据算法。
对称加密,密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
在很多地方还是会用到的,这里说一下这个:SM21.在pom.xml中引入依赖jar包:<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.58</version></dependency>2.然后来写一个工具类,用来生成国密的,公钥和私钥这个密码对.import org.bouncycastle.jce.provider.BouncyCastleProvider;import java.security.*;import java.security.spec.ECGenParameterSpec;import java.security.spec.PKCS8EncodedKeySpec;import java.security.spec.X509EncodedKeySpec;import java.util.Base64;/*** @author hulala* @Description 国密公私钥对工具类public class KeyUtils {/*** 生成国密公私钥对** @return* @throws Exception*/public static String[] generateSmKey() throws Exception {KeyPairGenerator keyPairGenerator = null;SecureRandom secureRandom = new SecureRandom();ECGenParameterSpec sm2Spec = new ECGenParameterSpec("sm2p256v1");keyPairGenerator = KeyPairGenerator.getInstance("EC", new BouncyCastleProvider());keyPairGenerator.initialize(sm2Spec);keyPairGenerator.initialize(sm2Spec, secureRandom);KeyPair keyPair = keyPairGenerator.generateKeyPair();PrivateKey privateKey = keyPair.getPrivate();PublicKey publicKey = keyPair.getPublic();//String[0] 公钥//String[1] 私钥String[] result = {new String(Base64.getEncoder().encode(publicKey.getEncoded())), new String(Base64.getEncoder().encode(privateKey.getEncoded())) };return result;}/*** 将Base64转码的公钥串,转化为公钥对象** @param publicKey* @return*/public static PublicKey createPublicKey(String publicKey) {PublicKey publickey = null;try {X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePublic(publicKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}/*** 将Base64转码的私钥串,转化为私钥对象** @param privateKey* @return*/public static PrivateKey createPrivateKey(String privateKey) {PrivateKey publickey = null;try {PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));KeyFactory keyFactory = KeyFactory.getInstance("EC", new BouncyCastleProvider());publickey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);} catch (Exception e) {e.printStackTrace();}return publickey;}}3.根据公钥和私钥工具类,生成的密钥对,对数据,进行加密和解密操作import org.bouncycastle.asn1.gm.GMObjectIdentifiers;import org.bouncycastle.crypto.InvalidCipherTextException;import org.bouncycastle.crypto.engines.SM2Engine;import org.bouncycastle.crypto.params.ECDomainParameters;import org.bouncycastle.crypto.params.ECPrivateKeyParameters;import org.bouncycastle.crypto.params.ECPublicKeyParameters;import org.bouncycastle.crypto.params.ParametersWithRandom;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.jce.spec.ECParameterSpec;import java.security.*;/*** @author hulala* @Description SM2实现工具类*/public class Sm2Util {static {Security.addProvider(new BouncyCastleProvider());}/*** 根据publicKey对原始数据data,使用SM2加密** @param data* @param publicKey* @return*/public static byte[] encrypt(byte[] data, PublicKey publicKey) {ECPublicKeyParameters localECPublicKeyParameters = null;if (publicKey instanceof BCECPublicKey) {BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters);}SM2Engine localSM2Engine = new SM2Engine();localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));byte[] arrayOfByte2;try {arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length);return arrayOfByte2;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 根据privateKey对加密数据encodedata,使用SM2解密** @param encodedata* @param privateKey* @return*/public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) {SM2Engine localSM2Engine = new SM2Engine();BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey;ECParameterSpec localECParameterSpec = sm2PriK.getParameters();ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),localECParameterSpec.getG(), localECParameterSpec.getN());ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(),localECDomainParameters);localSM2Engine.init(false, localECPrivateKeyParameters);try {byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length);return arrayOfByte3;} catch (InvalidCipherTextException e) {e.printStackTrace();return null;}}/*** 私钥签名** @param data* @param privateKey* @return* @throws Exception*/public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception { Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initSign(privateKey);sig.update(data);byte[] ret = sig.sign();return ret;}/*** 公钥验签** @param data* @param publicKey* @param signature* @return* @throws Exception*/public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initVerify(publicKey);sig.update(data);boolean ret = sig.verify(signature);return ret;}}4.来测试一下,对数据进行加密解密import org.junit.Test;import java.util.Base64;/*** @author hulala* @Description Sm2Util 的测试类*/public class Sm2UtilTest {private String testStr = "wangjing";java.security.PublicKey publicKey = null;java.security.PrivateKey privateKey = null;@Testpublic void test() throws Exception {//生成公私钥对String[] keys = KeyUtils.generateSmKey();System.out.println("原始字符串:" + testStr);System.out.println("公钥:" + keys[0]);publicKey = KeyUtils.createPublicKey(keys[0]);System.out.println("私钥:" + keys[1]);privateKey = KeyUtils.createPrivateKey(keys[1]);System.out.println("");byte[] encrypt = Sm2Util.encrypt(testStr.getBytes(), publicKey);String encryptBase64Str = Base64.getEncoder().encodeToString(encrypt);System.out.println("加密数据:" + encryptBase64Str);byte[] decode = Base64.getDecoder().decode(encryptBase64Str);byte[] decrypt = Sm2Util.decrypt(decode, privateKey);System.out.println("解密数据:" + new String(decrypt));byte[] sign = Sm2Util.signByPrivateKey(testStr.getBytes(), privateKey);System.out.println("数据签名:" + Base64.getEncoder().encodeToString(sign));boolean b = Sm2Util.verifyByPublicKey(testStr.getBytes(), publicKey, sign);System.out.println("数据验签:" + b);}}5.这样就实现了利用国密,SM2进行加密解密了.。
JAVA加密解密之消息摘要算法消息摘要算法是一种用于计算消息摘要(也称为哈希值)的算法。
它将任意长度的输入消息转换为固定长度的输出,该输出称为消息摘要。
在 Java 中,有多种消息摘要算法可供选择,例如MD5、SHA-1、SHA-256等。
下面将详细介绍几种常用的消息摘要算法以及如何在 Java中使用它们进行加密和解密。
1. MD5(Message Digest 5)算法:MD5算法以512位分组来处理输入消息,并产生一个128位(16字节)的消息摘要。
代码示例如下:```javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Examplepublic static void main(String[] args)String message = "Hello, world!";System.out.println(digest);}tryMessageDigest md = MessageDigest.getInstance("MD5");byte[] digest = md.digest(message.getBytes();StringBuilder sb = new StringBuilder(;for (byte b : digest)sb.append(String.format("%02x", b & 0xff));}return sb.toString(;} catch (NoSuchAlgorithmException e)e.printStackTrace(;return null;}}```2. SHA-1(Secure Hash Algorithm 1)算法:SHA-1算法与MD5算法类似,但它产生一个160位(20字节)的消息摘要。
MessageDigest的功能及⽤法MessageDigest 类为应⽤程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。
信息摘要是安全的单向哈希函数,它接收任意⼤⼩的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。
该对象通过使⽤ update()⽅法处理数据。
任何时候都可以调⽤ reset()⽅法重置摘要。
⼀旦所有需要更新的数据都已经被更新了,应该调⽤digest() ⽅法之⼀完成哈希计算。
对于给定数量的更新数据,digest⽅法只能被调⽤⼀次。
在调⽤digest之后,MessageDigest 对象被重新设置成其初始状态。
1、public static getInstance( algorithm)throws返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称2、public static getInstance( algorithm,provider)throws ,返回实现指定摘要算法的 MessageDigest 对象。
algorithm - 所请求算法的名称provider - 提供者的名称。
3、public void update(byte[] input)使⽤指定的 byte 数组更新摘要。
4、public byte[] digest()通过执⾏诸如填充之类的最终操作完成哈希计算。
在调⽤此⽅法之后,摘要被重置。
5、public static boolean isEqual(byte[] digesta,byte[] digestb)⽐较两个摘要的相等性。
做简单的字节⽐较。
注意:Provider可以通过.security.⽅法获取已注册提供者列表。
⽐较常⽤的有“SUN”SUN提供的常⽤的名称有:MD2MD5SHA-1SHA-256SHA-384SHA-512Code举例:import java.security.*;public class myDigest {public static void main(String[] args) {myDigest my=new myDigest();my.testDigest();}public void testDigest(){try {String myinfo="我的测试信息";//java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");alga.update(myinfo.getBytes());byte[] digesta=alga.digest();System.out.println("本信息摘要是:"+byte2hex(digesta));//通过某中⽅式传给其他⼈你的信息(myinfo)和摘要(digesta) 对⽅可以判断是否更改或传输正常java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");algb.update(myinfo.getBytes());if (algb.isEqual(digesta,algb.digest())) {System.out.println("信息检查正常");}else{System.out.println("摘要不相同");}}catch (java.security.NoSuchAlgorithmException ex) { System.out.println("⾮法摘要算法");}}public String byte2hex(byte[] b) //⼆⾏制转字符串{String hs="";String stmp="";for (int n=0;n<b.length;n++){stmp=(ng.Integer.toHexString(b[n] & 0XFF)); if (stmp.length()==1) hs=hs+"0"+stmp;else hs=hs+stmp;if (n<b.length-1) hs=hs+":";}return hs.toUpperCase();}}关于Java加密的更多信息:。
《JavaWeb安全开发指南》随着互联网的迅速发展,基于JavaWeb的应用也越来越多,但是随之而来的安全风险也在不断增多。
在JavaWeb开发中,安全性是至关重要的,因此我们需要对JavaWeb安全开发进行全面的了解和掌握,以便于更好地保障我们的JavaWeb应用程序的安全性。
1. 安全风险与威胁JavaWeb开发中的安全风险主要有以下几个方面:- SQL注入:黑客通过构造特殊的SQL语句,在无需登录的情况下就能够直接访问并控制数据库中的数据。
- XSS攻击:黑客通过在网站表单中注入JavaScript脚本,让其他用户在浏览网站时受到攻击。
- CSRF攻击:黑客通过伪造用户的登录信息,在用户不知情的情况下进行指定操作,如转账等。
- 文件上传漏洞:未对上传的文件进行严格的安全校验,导致黑客上传恶意文件进而实施攻击。
- 权限不足:未对各种操作的权限进行限制,导致恶意用户权限提升进而通过应用系统获取更多敏感数据。
以上这些安全威胁都是极其危险的,因此在JavaWeb开发中,必须要认真对待并进行严格的防范。
2. 如何进行JavaWeb的安全开发?JavaWeb安全开发需要从以下几个方面入手:- 输入校验:对用户输入的数据进行严格校验,防止数据篡改和攻击。
- 权限认证:对用户进行严格的身份验证和访问控制,以确保只有授权用户才能够访问敏感信息。
- 模板引擎安全:防范模板注入、命令注入等安全问题。
- 密码加密:对于数据库中的密码等敏感信息进行加密处理,防止其被黑客直接获得。
- 对拒绝服务攻击的防范:通过对流量控制、缓存控制等方式,防范拒绝服务攻击。
- 安全日志:记录各种异常操作,及时发现并修复问题。
3. 安全防范技术JavaWeb开发中安全防范技术主要包括以下几个方面:- SSL:创建安全的连接,防止信息被黑客拦截。
- 数据加密:采用对称加密与非对称加密方法对重要数据进行加密,既保证传输安全,又能够保障数据的完整性。
使⽤java获取md5值的两种⽅法Message Digest Algorithm MD5(中⽂名为消息摘要算法第五版)为计算机安全领域⼴泛使⽤的⼀种散列函数,是⼀种⽐较常⽤的哈希算法。
复制代码代码如下:public class md5_test {//MD5的字符串常量private final static String[] hexDigits = { "0", "1", "2", "3", "4","5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };public static void main(String[] args) {// TODO Auto-generated method stubtry {MessageDigest messageDigest= MessageDigest.getInstance("MD5");System.out.println(byteArrayToHexString(messageDigest.digest("".getBytes())));} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}}private static String byteArrayToHexString(byte[] b) {StringBuffer resultSb = new StringBuffer();for (int i = 0; i < b.length; i++) {resultSb.append(byteToHexString(b[i]));}return resultSb.toString();}/** 将⼀个字节转化成⼗六进制形式的字符串 */private static String byteToHexString(byte b) {int n = b;if (n < 0)n = 256 + n;int d1 = n / 16;int d2 = n % 16;return hexDigits[d1] + hexDigits[d2];}}复制代码代码如下:import mons.codec.digest.DigestUtils;public class ToMain {public static void main(String[] args) {System.out.println(DigestUtils.md5Hex(""));}}。
Java语言网络安全的支持与实现程杰(郑州大学升达经贸管理学院资讯管理系,郑州451191)摘要:二十一世纪随着人们的生活和工作越来越网络化,网络安全已渐渐成为人们关心的一个重要问题。
要保证信息在网络环境下是安全的,就必须对信息进行加密、签名、验证等一系列的操作。
而Java语言能够对网络安全通信进行很好的支持。
本文首先阐述了如何通过Java JDK本身提供的安全工具来实现玩了过安全通信,而后又阐述了如何通过Java语言来开发网络安全的应用程序。
关键字:安全策略;权限;数字签名;密钥;X.509;证书1. 引言随着计算机技术的飞速发展,信息网络已经成为社会发展的重要保证。
信息网络涉及到国家的政府、军事、文教等诸多领域。
其中存贮、传输和处理的信息有许多是重要的政府宏观调控决策、商业经济信息、银行资金转帐、股票证券、能源资源数据、科研数据等重要信息。
有很多是敏感信息,甚至是国家机密。
所以难免会吸引来自世界各地的各种人为攻击(例如信息泄漏、信息窃取、数据篡改、数据删添、计算机病毒等)。
为了保证网络中的信息是安全的,必须采用一些加密、数字签名、身份认证等安全策略来有效地防范网络安全。
Java语言在网络安全方面提供了很强大的技术支持,从而能够很有效地保护信息在网络中的保密性,完整性和可用性。
2. java 语言安全性概述2.1系统结构对于Java JDK,无论代码在本地还是在远端运行,都要对应一个安全策略(security policy)。
安全策略定义了不同签名者、不同来源的一套权限控制策略(permissions),在权限控制中说明了对资源(如文件、目录、网络端口等)的访问的权限,如图1所示:收稿日期:2009-2-23作者简介:程杰(1978-)男,硕士,主要从事计算机网络与网络安全方面的研究图1 Java 1.4 安全模型运行系统将代码组织到单独的域(domains) 中,每个域封装一组具有相同控制权限的类的实例。
java中使⽤MD5进⾏计算摘要java中使⽤MD5进⾏加密在各种应⽤系统的开发中,经常需要存储⽤户信息,很多地⽅都要存储⽤户密码,⽽将⽤户密码直接存储在服务器上显然是不安全的,本⽂简要介绍⼯作中常⽤的 MD5加密算法,希望能抛砖引⽟。
(⼀)消息摘要简介⼀个消息摘要就是⼀个数据块的数字指纹。
即对⼀个任意长度的⼀个数据块进⾏计算,产⽣⼀个唯⼀指印(对于SHA1是产⽣⼀个20字节的⼆进制数组)。
消息摘要是⼀种与消息认证码结合使⽤以确保消息完整性的技术。
主要使⽤单向散列函数算法,可⽤于检验消息的完整性,和通过散列密码直接以⽂本形式保存等,⽬前⼴泛使⽤的算法有MD4、MD5、SHA-1。
消息摘要有两个基本属性:1. 两个不同的报⽂难以⽣成相同的摘要2. 难以对指定的摘要⽣成⼀个报⽂,⽽可以由该报⽂反推算出该指定的摘要代表:美国国家标准技术研究所的SHA1和⿇省理⼯学院Ronald Rivest提出的MD5(⼆)对字符串进⾏加密/**利⽤MD5进⾏加密* @param str 待加密的字符串* @return加密后的字符串* @throws NoSuchAlgorithmException 没有这种产⽣消息摘要的算法* @throws UnsupportedEncodingException*/public String EncoderByMd5(String str) throws NoSuchAlgorithmException, UnsupportedEncodingException{//确定计算⽅法MessageDigest md5=MessageDigest.getInstance("MD5");BASE64Encoder base64en = new BASE64Encoder();//加密后的字符串String newstr=base64en.encode(md5.digest(str.getBytes("utf-8")));return newstr;}调⽤函数:String str="0123456789"System.out.println(EncoderByMd5(str));输出:eB5eJF1ptWaXm4bijSPyxw==(三)验证密码是否正确因为MD5是基于消息摘要原理的,消息摘要的基本特征就是很难根据摘要推算出消息报⽂,因此要验证密码是否正确,就必须对输⼊密码(消息报⽂)重新计算其摘要,和数据库中存储的摘要进⾏对⽐(即数据库中存储的其实为⽤户密码的摘要),若两个摘要相同,则说明密码正确,不同,则说明密码错误。
消息摘要(MessageDigest)⼀、概述消息摘要主要是验证数据的完整性,正确性。
消息摘要都是16进制的,所以计算出来的 byte 数组,需要转为16进制显⽰。
消息摘要不是加密算法,计算摘要的时候会丢失很多数据,具有不可逆性。
⽣成摘要的长度根据算法的不同⽽不同。
⼀个好的摘要算法,是极难产⽣Hash碰撞的。
MD5 不安全不是因为可以通过结果反推回去,也不可能反推回去,因为计算结果时就已经丢掉了⼤量的数据,⽽是因为有库可以查询明⽂和密⽂的映射(彩虹表),⽐如著名的⽹站:,就可以查询,还有就是 MD5 ⽆法防⽌碰撞。
⼆、使⽤⽅式⽐如,Tomcat 的下载页⾯如下:发现每个下载项后都跟随着(pgp,sha512),这就是消息摘要,⽂件下载完后计算其sha512的值,然后与这⾥的sha512的值做对⽐,如果⼀直,说明你下载的⽂件没问题。
下⾯是对⽐⽰例代码:import java.io.FileInputStream;import java.io.IOException;import java.math.BigInteger;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;/*** SHA家族的五个算法:SHA-1、SHA-224、SHA-256、SHA-384、SHA-512。
* 由美国国家安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。
* 后四者有时并称为SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)。
** JDK11⽀持的有:* 1、SHA* 2、SHA-224* 3、SHA-256* 4、SHA-384* 5、SHA-512* 6、SHA-512/224* 7、SHA-512/256* 8、SHA3-224* 9、SHA3-256* 10、SHA3-384* 11、SHA3-512** @author WuQinglong* @date 2021/1/18 16:10*/public class SHAMain {public static void main(String[] args) throws NoSuchAlgorithmException, IOException {// 下载页⾯的 sha512 的值String sha512 = "20029f00a64627a0fe9e6b86550d5244418e40cf933ba7ea985713e6cf638b8e13e16b0e3265a5fba1f0c7440e718e42ade4a10fc16d820bb801be1ac4a2aa5d";// 将⽂件读取成 byte 数组FileInputStream fis = new FileInputStream("/Users/wu/Downloads/apache-tomcat-9.0.41.zip”);// 在 JDK8 中没有 readAllBytes ⽅法byte[] bytes = fis.readAllBytes();// 计算 sha512 摘要MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");messageDigest.update(bytes);byte[] result = messageDigest.digest();// 转 16 进制表⽰String encodeResult= new BigInteger(1, result).toString(16);if (sha512.equals(encodeResult)) {System.out.println("⽂件完整");} else {System.out.println("⽂件不完整");}}}在 Java 中消息摘要的计算⽅式就是这个格式,如果想使⽤ MD5 计算的话,只需要改为 MessageDigest.getInstance("MD5”); 即可。
java messagedigest用法Java MessageDigest 是 Java 提供的一个用于实现消息摘要算法的类。
它可以通过输入一个任意长度的数据产生一个固定长度的摘要(hash 值),这个摘要可以用于确保数据在传输或存储过程中不被篡改。
一、了解消息摘要算法1.1 消息摘要算法基本概念1.2 常见的消息摘要算法1.3 消息摘要算法的应用场景二、消息摘要算法的实现原理2.1 消息的填充方式2.2 压缩函数2.3 链接函数三、Java MessageDigest 类的功能介绍3.1 java.security.MessageDigest 类的基本特点3.2 MessageDigest 支持的算法3.3 MessageDigest 实例的创建和初始化3.4 MessageDigest 的常用方法四、使用 Java MessageDigest 进行消息摘要的步骤4.1 导入 java.security.MessageDigest 类4.2 创建 MessageDigest 实例4.3 通过 update() 方法向 MessageDigest 实例提供数据4.4 通过 digest() 方法获取摘要结果五、示例代码演示5.1 使用 MD5 算法生成消息摘要5.2 使用 SHA1 算法生成消息摘要5.3 使用 SHA256 算法生成消息摘要六、消息摘要的应用6.1 数据的完整性验证6.2 密码存储6.3 数字签名七、消息摘要算法的安全性和破解7.1 安全性分析7.2 暴力破解和碰撞攻击7.3 预防破解的方法八、Java MessageDigest 的局限性和改进8.1 算法的更新和替换8.2 长消息的处理性能九、小结这是一个大致的目录,你可以根据需要进行调整和修改。
希望对你的文章写作有所帮助。