Board logo

标题: JAVA第三方哈希工具: jhash [打印本页]

作者: happy886rr    时间: 2017-8-3 22:26     标题: JAVA第三方哈希工具: jhash

jhash.jar  (JAVA CONSOLE HASH TOOL, BY HAPPY, VERSION 1.0.1.170807)
[1.0.1.170807版] :修复数个漏洞,并优化手机下的运行速度。
附件下载链接: https://pan.baidu.com/s/16poWUX5u2eclS-xwf7-iBA?pwd=icep
摘要:
===================================================
控制台HASH摘要工具: jhash.jar。兼具字符串HASH、文件HASH计算。 支持MD5,
CRC32, SHA-1, SHA-256, SHA-384, SHA-512  等多种HASH算法。

基于JRE运行时的广义第三方, 覆盖windows、linux、树莓派、安卓及各类微型设备
。一次编写,随处运行。CMD可直接调用,无异于exe第三方。安全、可靠、跨平台。

利用DX转化技术可将JAPI与AndroidAPI等价转化,从而在安卓控制台上直接运行基础
类jar包。
===================================================



要求:
---------------------------------------------------------------------------------
JRE1.6及以上 JAVA运行时环境
---------------------------------------------------------------------------------

手机端运行方法:
---------------------------------------------------------------------------------
请使用 ej脚本运行,参见教程http://www.bathome.net/thread-44950-1-1.html
备注: JAVA第三方已做dx转化,无需再次做安卓虚拟机字节码转化。
启动命令为:
       sh ./ej.sh "jhash.jar"  "com.android.jhash.Main"
---------------------------------------------------------------------------------

使用:
---------------------------------------------------------------------------------
jhash.jar [输入对象] (-F) (-W) -H [哈希类型]

-W 完全哈希;
-F 文件哈希;
-H 指定哈希类型;
-h 使用帮助;
---------------------------------------------------------------------------------
java -jar jhash.jar "你好"
java -jar jhash.jar "你好" -W
java -jar jhash.jar "test.zip" -F
java -jar jhash.jar "test.zip" -WF
java -jar jhash.jar "test.zip" -FHMD5
java -jar jhash.jar "test.zip" -FHCRC32
java -jar jhash.jar "test.zip" -FHSHA1
java -jar jhash.jar "test.zip" -FHSHA-1
...
---------------------------------------------------------------------------------


英译:
---------------------------------------------------------------------------------
Usage instructions:
       java -jar jhash.jar [input] (-F) (-W) -H [hash type]
       java -Xms1024m -Xmx1024m -jar jhash.jar ...
---------------------------------------------------------------------------------
General options:
       --help, -h  Show help information.
       --file, -F  Calculate the input as a file.
       --whole, -W  Calculate the whole hash type.
       --hashtype, -H  Set the hash type.
Available hash types:
       MD5, CRC32, SHA-1, SHA-256, SHA-384, SHA-512
Official website:
       http://www.bathome.net/thread-44921-1-1.html
---------------------------------------------------------------------------------
AT LEAST JRE1.6, VERSION: 1.0.1.170807


原创代码:
  1. package com.android.jhash;
  2. /**开关解析类包*/
  3. import gnu.getopt.LongOpt;
  4. import gnu.getopt.Getopt;
  5. /**IO 操作类包*/
  6. import java.io.File;
  7. import java.io.FileInputStream;
  8. import java.io.IOException;
  9. /**安全框架类包*/
  10. import java.security.MessageDigest;
  11. import java.security.NoSuchAlgorithmException;
  12. /**实用工具类包*/
  13. import java.util.zip.CRC32;
  14. /**数学计算类包*/
  15. import java.math.BigInteger;
  16. /**Main主类
  17. * @author Happy from BatHome
  18. * @date Thu Aug 03 2017 20:11:16 GMT+0800
  19. * @description jhash.jar
  20. */
  21. public class Main
  22. {
  23. private static final String HELP_INFORMATION =
  24.     ""
  25.     + "JHASH.JAR - JAVA CONSOLE HASH TOOL, COPYRIGHT@2017~2019 BY HAPPY\n"
  26.     + "-----------------------------------------------------------------------\n"
  27.     + "Usage instructions:\n"
  28.     + "       java -jar jhash.jar [input] (-F) (-W) -H [hash type]\n"
  29.     + "       java -Xms1024m -Xmx1024m -jar jhash.jar ...\n"
  30.     + "-----------------------------------------------------------------------\n"
  31.     + "General options:\n"
  32.     + "       --help, -h  Show help information.\n"
  33.     + "       --file, -F  Calculate the input as a file.\n"
  34.     + "       --whole, -W  Calculate the whole hash type.\n"
  35.     + "       --hashtype, -H  Set the hash type.\n\n"
  36.     + "Available hash types:\n"
  37.     + "       MD5, CRC32, SHA-1, MD2, SHA-256, SHA-384, SHA-512\n\n"
  38.     + "Official website:\n"
  39.     + "       http://www.bathome.net/thread-44921-1-1.html\n"
  40.     + "-----------------------------------------------------------------------\n"
  41.     + "AT LEAST JRE1.6, VERSION: 1.0.1.170807\n";
  42. /**获取字符串HASH值
  43. * @param str
  44. * @param hashType
  45. * @return
  46. * @throws Exception
  47. */
  48. private static String getStringHash(String hashString, String hashType) throws Exception
  49. {
  50. try
  51. {
  52. // 单独针对CRC32生成摘要算法
  53. if(hashType.equals("CRC32"))
  54. {
  55. CRC32 objectCRC32 = new CRC32();
  56. objectCRC32.update(hashString.getBytes());
  57. // 返回CRC32摘要分支
  58. return Long.toHexString(objectCRC32.getValue());
  59. }
  60. // 生成HASH摘要算法
  61. MessageDigest messageDigest = MessageDigest.getInstance(hashType);
  62. // 获取二进制
  63. messageDigest.update(hashString.getBytes());
  64. // 返回16进制 HASH字串
  65. return new BigInteger(1, messageDigest.digest()).toString(16);
  66. }
  67. catch (Exception e)
  68. {
  69. // 抛出摘要错误
  70. throw new Exception("HASH encryption error!");
  71. }
  72. }
  73. /**获取文件HASH值
  74. * @param hashFile
  75. * @param hashType
  76. * @return
  77. * @throws IOException
  78. * @throws NoSuchAlgorithmException
  79. */
  80. private static String getFileHash(String hashFile, String hashType) throws IOException, NoSuchAlgorithmException
  81. {
  82. try
  83. {
  84. // 创建文件流
  85. File fp = new File(hashFile);
  86. // 创建输入流
  87. FileInputStream inStream = new FileInputStream(fp);
  88. // 缓存容器
  89. byte[] byteBuffer = new byte[4096];
  90. // 每次读入缓存的长度
  91. int readLength;
  92. // 单独针对CRC32生成文件摘要算法
  93. if(hashType.equals("CRC32"))
  94. {
  95. CRC32 objectCRC32 = new CRC32();
  96. while ((readLength=inStream.read(byteBuffer)) != -1)
  97. {
  98. objectCRC32.update(byteBuffer, 0, readLength);
  99. }
  100. // 关闭输入流
  101. inStream.close();
  102. // 返回CRC32文件摘要分支
  103. return Long.toHexString(objectCRC32.getValue());
  104. }
  105. // 生成HASH摘要算法
  106. MessageDigest messageDigest = MessageDigest.getInstance(hashType);
  107. while ((readLength=inStream.read(byteBuffer)) != -1)
  108. {
  109. messageDigest.update(byteBuffer, 0, readLength);
  110. }
  111. // 关闭输入流
  112. inStream.close();
  113. // 返回该文件的16进制 HASH字串
  114. return new BigInteger(1, messageDigest.digest()).toString(16);
  115. }
  116. catch (IOException e)
  117. {
  118. // 抛出摘要错误
  119. throw new IOException("HASH file encryption error!");
  120. }
  121. }
  122. /**
  123. * @param args
  124. * @throws Exception
  125. */
  126. public static void main(String[] args) throws Exception
  127. {
  128. //参数不足时,抛出使用说明
  129. if (args.length < 1)
  130. {
  131. System.out.println(HELP_INFORMATION);
  132. return;
  133. }
  134. // 设置长选项开关
  135. LongOpt[] lopts =
  136. {
  137. new LongOpt("help",     LongOpt.NO_ARGUMENT,       null, 'h'),
  138. new LongOpt("file",     LongOpt.NO_ARGUMENT,       null, 'F'),
  139. new LongOpt("whole",    LongOpt.NO_ARGUMENT,       null, 'W'),
  140. new LongOpt("hashtype", LongOpt.REQUIRED_ARGUMENT, null, 'H')
  141. };
  142. // 创建开关解析对象
  143. Getopt g = new Getopt("JHASH", args, "WFH:h", lopts);
  144. // 缺省模式为 字符串HASH模式
  145. boolean hashFileFlag = false;
  146. // 完全HASH模式
  147. boolean hashWholeFlag = false;
  148. // 缺省HASH类型为 MD5摘要
  149. String hashType = "MD5";
  150. String hashObject = null;
  151. int c;
  152. // 执行开关解析
  153. while ((c=g.getopt()) != -1)
  154. {
  155. switch(c)
  156. {
  157. case 'h':
  158. // 抛出使用说明
  159. System.out.println(HELP_INFORMATION);
  160. return;
  161. case 'F':
  162. // 开启文件HASH模式
  163. hashFileFlag = true;
  164. break;
  165. case 'W':
  166. // 抛出使用说明
  167. hashWholeFlag = true;
  168. break;
  169. case 'H':
  170. // 获取HASH类型
  171. hashType = g.getOptarg().toUpperCase();
  172. if(hashType.equals("SHA1"))
  173. {
  174. hashType = "SHA-1";
  175. }
  176. else if(hashType.equals("SHA256"))
  177. {
  178. hashType = "SHA-256";
  179. }
  180. else if(hashType.equals("SHA384"))
  181. {
  182. hashType = "SHA-384";
  183. }
  184. else if(hashType.equals("SHA512"))
  185. {
  186. hashType = "SHA-512";
  187. }
  188. else if(hashType.equals("MD5"))
  189. {
  190. }
  191. else if(hashType.equals("CRC32"))
  192. {
  193. }
  194. else if(hashType.equals("SHA-1"))
  195. {
  196. }
  197. else if(hashType.equals("SHA-256"))
  198. {
  199. }
  200. else if(hashType.equals("SHA-384"))
  201. {
  202. }
  203. else if(hashType.equals("SHA-512"))
  204. {
  205. }
  206. else
  207. {
  208. // 不支持的、错误的  HASH类型
  209. System.out.printf("Error hash type '%s', or unsupported hash type.\n", hashType);
  210. return;
  211. }
  212. break;
  213. default:
  214. // 遇到无法解析的开关,操作中断
  215. System.out.printf("You can try '-h' or '--help' to get help information.\n", (char)g.getOptopt());
  216. return;
  217. }
  218. }
  219. // 提取未解析的参数作为 HASH对象
  220. if(g.getOptind() < args.length)
  221. {
  222. hashObject = args[g.getOptind()];
  223. }
  224. else
  225. {
  226. System.out.println("Needs input object!");
  227. return;
  228. }
  229. // 如果为文件模式,先判断文件是否存在
  230. if(hashFileFlag)
  231. {
  232. File fp = new File(hashObject);
  233. if(! fp.exists())
  234. {
  235. System.out.printf("The file \"%s\" is not exist.\n", hashObject);
  236. return;
  237. }
  238. }
  239. // 如果是全HASH模式
  240. if(hashWholeFlag)
  241. {
  242. if(hashFileFlag)
  243. {
  244. System.out.println
  245. (""
  246. + "[File hash]\n"
  247. + "MD5    : " + getFileHash(hashObject, "MD5"    ) + "\n"
  248. + "CRC32  : " + getFileHash(hashObject, "CRC32"  ) + "\n"
  249. + "SHA-1  : " + getFileHash(hashObject, "SHA-1"  ) + "\n"
  250. //+ "MD2    : " + getFileHash(hashObject, "MD2"    ) + "\n"
  251. + "SHA-256: " + getFileHash(hashObject, "SHA-256") + "\n"
  252. + "SHA-384: " + getFileHash(hashObject, "SHA-384") + "\n"
  253. + "SHA-512: " + getFileHash(hashObject, "SHA-512") + "\n"
  254. );
  255. }
  256. else
  257. {
  258. System.out.println
  259. (""
  260. + "[String hash]\n"
  261. + "MD5    : " + getStringHash(hashObject, "MD5"    ) + "\n"
  262. + "CRC32  : " + getStringHash(hashObject, "CRC32"  ) + "\n"
  263. + "SHA-1  : " + getStringHash(hashObject, "SHA-1"  ) + "\n"
  264. //+ "MD2    : " + getStringHash(hashObject, "MD2"    ) + "\n"
  265. + "SHA-256: " + getStringHash(hashObject, "SHA-256") + "\n"
  266. + "SHA-384: " + getStringHash(hashObject, "SHA-384") + "\n"
  267. + "SHA-512: " + getStringHash(hashObject, "SHA-512") + "\n"
  268. );
  269. }
  270. return;
  271. }
  272. // 对文件模式,执行 getFileHash方法
  273. if(hashFileFlag)
  274. {
  275. System.out.printf("%s File Code: %s\n", hashType, getFileHash(hashObject, hashType));
  276. }
  277. else
  278. {
  279. System.out.printf("%s String Code: %s\n", hashType, getStringHash(hashObject, hashType));
  280. }
  281. return;
  282. }
  283. }
复制代码

作者: happy886rr    时间: 2017-8-4 09:00

本帖最后由 happy886rr 于 2017-8-4 09:08 编辑

回复 3# 老刘1号
昨天忘了上传附件,今天补上了JHASH.7z,更新大GB文件HASH溢出漏洞,请安装jdk运行jhash.jar, 测试获取hash速度比C语言都快,java优化的太好了。
作者: Batcher    时间: 2017-8-4 10:02

回复 2# happy886rr


能否给些测试数据?
比如哪个版本的JDK、多大的文件、C和jhash分别耗时多少...
作者: codegay    时间: 2017-8-4 14:34

我觉得性能接近C可以理解,如果是超过那就要看C的代码了。
作者: PS2.0    时间: 2017-8-4 16:06

提供一个数据做比较:
PowerShell的Get-FileHash计算一个5GB文件的MD5耗时20秒
  1. PS C:\Test> Measure-Command {Get-FileHash C:\cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso -Algorithm MD5}
  2. Days              : 0
  3. Hours             : 0
  4. Minutes           : 0
  5. Seconds           : 20
  6. Milliseconds      : 833
  7. Ticks             : 208332954
  8. TotalDays         : 0.000241126104166667
  9. TotalHours        : 0.0057870265
  10. TotalMinutes      : 0.34722159
  11. TotalSeconds      : 20.8332954
  12. TotalMilliseconds : 20833.2954
  13. PS C:\Test> (Get-Item C:\cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso).Length/(1024*1024*1024)
  14. 5.16484069824219
复制代码

作者: happy886rr    时间: 2017-8-4 17:01

本帖最后由 happy886rr 于 2017-8-4 17:20 编辑

回复 5# PS2.0
5GB耗时20秒? 每秒读取速度超过240M,这是固态硬盘吗?SSD、SHDD、HDD ?
如果我用更好的SSD颗粒,那岂不是速度更快!组阵列瞬间读入内存,再做md5,只需要三分之一的时间。
md5摘要计算耗时不多,耗时的是文件的读取。
作者: PS2.0    时间: 2017-8-4 21:33

回复 6# happy886rr


是SSD
你说的太高深了我不懂
jhash比C快主要是哪部分快呢?
作者: codegay    时间: 2017-8-6 07:55

https://blake2.net/

BLAKE2 is a cryptographic hash function faster than MD5, SHA-1, SHA-2, and SHA-3, yet is at least as secure as the latest standard SHA-3. BLAKE2 has been adopted by many projects due to its high speed, security, and simplicity.

作者: happy886rr    时间: 2017-8-6 22:03

本帖最后由 happy886rr 于 2017-8-7 11:06 编辑

回复 8# codegay
之前考虑过,后来觉得BLAKE2不是很常用,而且在安卓手机上对该算法的支持也不是很好,就砍掉了。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2