摘要Java 加密解密之消息摘要算法(MD5 SHA MAC)

md5解密  时间:2021-01-31  阅读:()

Java加密解密之消息摘要算法MD5 SHA MAC

本文转自网络

消息摘要

消息摘要Message Digest又称为数字摘要(Digital Digest)。它是一个唯一对应一个消息或文本的固定长度的值它由一个单向Hash加密函数对消息进行作用而产生。如果消息在途中改变了则接收者通过对收到消息的新产生的摘要与原摘要比较就可知道消息是否被改变了。因此消息摘要保证了消息的完整性。消息摘要采用单向Hash函数将需加密的明文"摘要"成一串128bit的密文这一串密文亦称为数字指纹(FingerPrint)它有固定的长度且不同的明文摘要成密文其结果总是不同的而同样的明文其摘要必定一致。这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。

HASH函数的抗冲突性使得如果一段明文稍有变化哪怕只更改该段落的一个字母通过哈希算法作用后都将产生不同的值。而HASH算法的单向性使得要找到到哈希值相同的两个不同的输入消息在计算上是不可能的。所以数据的哈希值即消息摘要可以检验数据的完整性。哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。因此如果两个文档经哈希转换后成为相同的值就可以肯定它们是同一文档。所以 当希望有效地比较两个数据块时就可以比较它们的哈希值。例如可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改。

消息摘要算法

消息摘要算法的主要特征是加密过程不需要密钥并且经过加密的数据无法被解密只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题适合于分布式网络相同上使用。 由于其加密计算的工作量相当可观所以以前的这种算法通常只用于数据量有限的情况下的加密例如计算机的口令就是用不可逆加密算法加密的。近年来随着计算机相同性能的飞速改善加密速度不再成为限制这种加密技术发展的桎梏因而消息摘要算法应用的领域不断增加。

消息摘要算法的特点

①无论输入的消息有多长计算出来的消息摘要的长度总是固定的。

②消息摘要看起来是“随机的”。这些比特看上去是胡乱的杂凑在一起的。

③一般地只要输入的消息不同对其进行摘要以后产生的摘要消息也必不相同但相同的输入必会产生相同的输出。

④消息摘要函数是无陷门的单向函数即只能进行正向的信息摘要而无法从摘要中恢复出任何的消息甚至根本就找不到任何与原信息相关的信息。⑤好的摘要算法无法找到两条消息是它们的摘要相同。

现有的消息摘要算法

消息摘要算法包含MD、 SHA和MAC三大系列常用于验证数据的完整性是数据签名算法的核心算法。

MAC与MD和SHA不同MAC是含有密钥的散列函数算法我们也常把MAC称为HMAC。

JDK对消息摘要算法的支持

JDK6支持

MD2/MD5/SHA/SHA256/SHA384/SHA512/HmacMD5/HmacSHA1/HmacSHA256/HmacSHA384/HmacSHA512

使用到十六进制工具类Hex.java 见 java byte数组与十六进制字符串互转MD和SHA系列的java实现

DigestUti ls.java

J a va代码

1. import java.security.MessageDigest;

2. import java.security.NoSuchAlgorithmException;

3.

4. /**

5. * reference apache commons <a

6. * href="http://commons.apache.org/codec/">http://commons.apache.org/codec/<

/a>

7. *

8. * support MD2/MD5/SHA/SHA256/SHA384/SHA512

9. * @author Aub

10. *

11. */

12. public class DigestUtils {

13.

14. /**

15. *根据给定摘要算法创建一个消息摘要实例

16. *

17. * @param algorithm

18. * 摘要算法名

19. * @return消息摘要实例

20. * @see MessageDigest#getInstance(String)

21. * @throws RuntimeException

22. * 当{@link java.security.NoSuchAlgorithmException}发生时

23. */

24. static MessageDigest getDigest(String algorithm) {

25. try {

26. return MessageDigest.getInstance(algorithm) ;

27. } catch (NoSuchAlgorithmException e) {

28. throw new RuntimeException(e.getMessage( )) ;

29. }

30. }

31.

32. /**

33. *获取MD5消息摘要实例

34. *

35. * @return MD5消息摘要实例

36. * @throws RuntimeException

37. * 当{@link java.security.NoSuchAlgorithmException}发生时

38. */

39. private static MessageDigest getMd5Digest() {

40. return getDigest( "MD5");

41. }

42.

43. /**

44. *获取SHA-1消息摘要实例

45. *

46. * @return SHA-1消息摘要实例

47. * @throws RuntimeException

48. * 当{@link java.security.NoSuchAlgorithmException}发生时

49. */

50. private static MessageDigest getShaDigest() {

51. return getDigest( "SHA");

52. }

53.

54. /**

55. *获取SHA-256消息摘要实例

56. *

57. * @return SHA-256消息摘要实例

58. * @throws RuntimeException

59. * 当{@link java.security.NoSuchAlgorithmException}发生时

60. */

61. private static MessageDigest getSha256Digest( ) {

62. return getDigest( "SHA-256") ;

63. }

64.

65. /**

66. *获取SHA-384消息摘要实例

67. *

68. * @return SHA-384消息摘要实例

69. * @throws RuntimeException

70. * 当{@link java.security.NoSuchAlgorithmException}发生时

71. */

72. private static MessageDigest getSha384Digest( ) {

73. return getDigest( "SHA-384") ;

74. }

75.

76. /**

77. *获取SHA-512消息摘要实例

78. *

79. * @return SHA-512消息摘要实例

80. * @throws RuntimeException

81. * 当{@link java.security.NoSuchAlgorithmException}发生时

82. */

83. private static MessageDigest getSha512Digest( ) {

84. return getDigest( "SHA-512") ;

85. }

86.

87. /**

88. *使用MD 5消息摘要算法计算消息摘要

89. *

90. * @param data

91. * 做消息摘要的数据

92. * @return消息摘要长度为16的字节数组

93. */

94. public static byte[] encodeMD5(byte[ ] data) {

95. return getMd5Digest() .digest(data) ;

96. }

97.

98. /**

99. *使用MD 5消息摘要算法计算消息摘要

100. *

101. * @param data

102. * 做消息摘要的数据

103. * @return消息摘要长度为32的十六进制字符串

104. */

105. public static String encodeMD5Hex(byte[] data) {

106. return Hex.encodeHexStr(encodeMD5(data) );

107. }

108.

109. /**

110. *使用SHA-1消息摘要算法计算消息摘要

111. *

112. * @param data

113. * 做消息摘要的数据

114. * @return SHA-1消息摘要长度为20的字节数组

115. */

116. public static byte[] encodeSHA(byte[ ] data) {

117. return getShaDigest() .digest(data) ;

118. }

119.

120. /**

121. *使用SHA-1消息摘要算法计算消息摘要

122. *

123. * @param data

124. * 做消息摘要的数据

125. * @return SHA-1消息摘要长度为40的十六进制字符串

126. */

127. public static String encodeSHAHex(byte[] data) {

128. return Hex.encodeHexStr(getShaDigest( ) .digest(data) ) ;

129. }

130.

131. /**

132. *使用SHA-256消息摘要算法计算消息摘要

133. *

134. * @param data

135. * 做消息摘要的数据

136. * @return SHA-256消息摘要长度为32的字节数组

137. */

138. public static byte[] encodeSHA256(byte[] data) {

139. return getSha256Digest() .digest(data) ;

140. }

141.

142. /**

143. *使用SHA-256消息摘要算法计算消息摘要

144. *

145. * @param data

146. * 做消息摘要的数据

147. * @return SHA-256消息摘要长度为64的十六进制字符串

148. */

149. public static String encodeSHA256Hex(byte[] data) {

150. return Hex.encodeHexStr(encodeSHA256(data) );

151. }

152.

153. /**

154. *使用SHA-384消息摘要算法计算消息摘要

155. *

156. * @param data

157. * 做消息摘要的数据

158. * @return SHA-384消息摘要长度为43的字节数组

159. */

160. public static byte[] encodeSHA384(byte[] data) {

161. return getSha384Digest() .digest(data) ;

162. }

163.

164. /**

165. *使用SHA-384消息摘要算法计算消息摘要

166. *

167. * @param data

168. * 做消息摘要的数据

169. * @return SHA-384消息摘要长度为86的十六进制字符串

170. */

171. public static String encodeSHA384Hex(byte[] data) {

172. return Hex.encodeHexStr(encodeSHA384(data) );

173. }

174.

175. /**

176. *使用SHA-512消息摘要算法计算消息摘要

177. *

178. * @param data

179. * 做消息摘要的数据

180. * @return SHA-512消息摘要长度为64的字节数组

181. */

182. public static byte[] encodeSHA512(byte[] data) {

183. return getSha512Digest() .digest(data) ;

184. }

185.

186. /**

187. *使用SHA-512消息摘要算法计算消息摘要

188. *

189. * @param data

190. * 做消息摘要的数据

191. * @return SHA-512消息摘要长度为128的十六进制字符串

192. */

193. public static String encodeSHA512Hex(byte[] data) {

194. return Hex.encodeHexStr(encodeSHA512(data) );

195. }

196.

197. }

参考org.apache.commons.codec.digest.DigestUti ls

下载地址 http://commons.apache.org/codec/download_codec.cgiMAC系列的java实现

Hmac.java

J a va代码

1. import java.security.InvalidKeyException;

2. import java.security.Key;

3. import java.security.NoSuchAlgorithmException;

4.

5. import javax.crypto.KeyGenerator;

6. import javax.crypto.Mac;

7. import javax.crypto.SecretKey;

8. import javax.crypto.spec.SecretKeySpec;

9.

10. /**

11. * Hmac<br/>

12. * algorithm HmacMD5/HmacSHA/HmacSHA256/HmacSHA384/HmacSHA512

13. * @author Aub

14. */

15. public class Hmac {

16.

17. /**

18. *根据给定密钥生成算法创建密钥

19. *

20. * @param algorithm

21. * 密钥算法

22. * @return密钥

23. * @throws RuntimeException

24. * 当{@link java.security.NoSuchAlgorithmException}发生时

25. */

26. private static byte[ ] getHmacKey(String algorithm){

27. //初始化KeyGenerator

28. KeyGenerator keyGenerator = null;

29. try {

30. keyGenerator = KeyGenerator.getInstance(algorithm) ;

31. } catch (NoSuchAlgorithmException e) {

32. throw new RuntimeException(e.getMessage( )) ;

33. }

34. //产生密钥

35. SecretKey secretKey = keyGenerator.generateKey( );

36. //获得密钥

37. return secretKey.getEncoded() ;

38. }

39.

40. /**

41. *获取HmaMD5的密钥

42. *

43. * @return HmaMD5的密钥

44. * @throws RuntimeException

45. * 当{@link java.security.NoSuchAlgorithmException}发生时

46. */

47. public static byte[] getHmaMD5key(){

48. return getHmacKey("HmacMD5" );

49. }

50.

51. /**

52. *获取HmaSHA的密钥

53. *

54. * @return HmaSHA的密钥

55. * @throws RuntimeException

56. * 当{@link java.security.NoSuchAlgorithmException}发生时

57. */

58. public static byte[] getHmaSHAkey(){

59. return getHmacKey("HmacSHA1") ;

60. }

61.

62. /**

63. *获取HmaSHA256的密钥

64. *

65. * @return HmaSHA256的密钥

66. * @throws RuntimeException

67. * 当{@link java.security.NoSuchAlgorithmException}发生时

68. */

69. public static byte[] getHmaSHA256key(){

70. return getHmacKey("HmacSHA256") ;

71. }

72.

73. /**

74. *获取HmaSHA384的密钥

75. *

76. * @return HmaSHA384的密钥

77. * @throws RuntimeException

78. * 当{@link java.security.NoSuchAlgorithmException}发生时

79. */

80. public static byte[] getHmaSHA384key(){

81. return getHmacKey("HmacSHA384") ;

82. }

83.

84. /**

85. *获取HmaSHA512的密钥

86. *

87. * @return HmaSHA384的密钥

88. * @throws RuntimeException

89. * 当{@link java.security.NoSuchAlgorithmException}发生时

90. */

91. public static byte[] getHmaSHA512key(){

92. return getHmacKey("HmacSHA512") ;

93. }

94.

95. /**

96. *转换密钥

97. *

98. * @param key 二进制密钥

99. * @param algorithm密钥算法

100. * @return密钥

101. */

102. private static Key toKey(byte[ ] key,String algorithm){

103. //生成密钥

104. return new SecretKeySpec(key, algorithm);

105. }

106.

107. /**

108. *使用HmacMD5消息摘要算法计算消息摘要

109. *

110. * @param data做消息摘要的数据

111. * @param key密钥

112. * @return消息摘要长度为16的字节数组

113. */

114. public static byte[] encodeHmacMD5(byte[ ] data, Key key){

10gbiz:香港/洛杉矶CN2直连线路VPS四折优惠,直连香港/香港/洛杉矶CN2四折

10gbiz怎么样?10gbiz在本站也多次分享过,是一家成立于2020的国人主机商家,主要销售VPS和独立服务器,机房目前有中国香港和美国洛杉矶、硅谷等地,线路都非常不错,香港为三网直连,电信走CN2,洛杉矶线路为三网回程CN2 GIA,10gbiz商家七月连续推出各种优惠活动,除了延续之前的VPS产品4折优惠,目前增加了美国硅谷独立服务器首月半价的活动,有需要的朋友可以看看。10gbiz优惠码...

无忧云:服务器100G高防云服务器,bgpBGP云,洛阳BGP云服务器2核2G仅38.4元/月起

无忧云怎么样?无忧云值不值得购买?无忧云,无忧云是一家成立于2017年的老牌商家旗下的服务器销售品牌,现由深圳市云上无忧网络科技有限公司运营,是正规持证IDC/ISP/IRCS商家,主要销售国内、中国香港、国外服务器产品,线路有腾讯云国外线路、自营香港CN2线路等,都是中国大陆直连线路,非常适合免备案建站业务需求和各种负载较高的项目,同时国内服务器也有多个BGP以及高防节点。目前,四川雅安机房,4...

UCloud:全球大促降价,云服务器全网最低价,1核1G快杰云服务器47元/年

ucloud:全球大促活动降价了!这次云服务器全网最低价,也算是让利用户了,UCloud商家调低了之前的促销活动价格,并且新增了1核1G内存配置快杰型云服务器,价格是47元/年(也可选2元首月),这是全网同配置最便宜的云服务器了!UCloud全球大促活动促销机型有快杰型云服务器和通用型云服务器,促销机房国内海外都有,覆盖全球20个城市,具体有北京、上海、广州、香港、 台北、日本东京、越南胡志明市、...

md5解密为你推荐
内存卡数据恢复软件怎样找回sd卡文件恢复相机内存卡数据恢复相机内存卡上的数据丢失了,怎么恢复?集成显卡和独立显卡哪个好集成显卡和独立显卡的区别?哪个更好?江门旅游景点哪个好玩的地方江门有什么地方好玩的?唱K 行街 免答华为p40和mate30哪个好mate30 5G和p40 5G有什么区别?压缩软件哪个好现在哪个压缩软件最稳定又快 ?核芯显卡与独立显卡哪个好英特尔核芯显卡怎么样?和独立显卡那个更好?股票软件哪个好请问:免费的模拟炒股软件哪个好?海克斯皮肤哪个好LOL用100块是抽海克斯好还是抽蛮王的生化领主的活动还是直接买皮肤好网络机顶盒哪个好什么牌子的网络机顶盒最好
提供香港vps 新网域名解析 cn域名个人注册 site5 rak机房 512av vip购优汇 空间登录首页 免费asp空间 美国盐湖城 lamp是什么意思 如何登陆阿里云邮箱 中国联通宽带测试 godaddy空间 谷歌搜索打不开 .htaccess 第八届中美互联网论坛 达拉斯 rewrite规则 流媒体服务器软件 更多