找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19951|回复: 8

JAVA第三方哈希工具: jhash

[复制链接]
发表于 2017-8-3 22:26:56 | 显示全部楼层 |阅读模式
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. }
复制代码

评分

参与人数 2PB +6 技术 +2 收起 理由
523066680 + 6 + 1 技术全面,信手拈来
老刘1号 + 1 666

查看全部评分

 楼主| 发表于 2017-8-4 09:00:36 | 显示全部楼层
本帖最后由 happy886rr 于 2017-8-4 09:08 编辑

回复 3# 老刘1号
昨天忘了上传附件,今天补上了JHASH.7z,更新大GB文件HASH溢出漏洞,请安装jdk运行jhash.jar, 测试获取hash速度比C语言都快,java优化的太好了。
发表于 2017-8-4 10:02:14 | 显示全部楼层
回复 2# happy886rr


能否给些测试数据?
比如哪个版本的JDK、多大的文件、C和jhash分别耗时多少...
发表于 2017-8-4 14:34:37 | 显示全部楼层
我觉得性能接近C可以理解,如果是超过那就要看C的代码了。
发表于 2017-8-4 16:06:23 | 显示全部楼层
提供一个数据做比较:
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
复制代码
 楼主| 发表于 2017-8-4 17:01:44 | 显示全部楼层
本帖最后由 happy886rr 于 2017-8-4 17:20 编辑

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


是SSD
你说的太高深了我不懂
jhash比C快主要是哪部分快呢?
发表于 2017-8-6 07:55:07 | 显示全部楼层
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.
 楼主| 发表于 2017-8-6 22:03:46 | 显示全部楼层
本帖最后由 happy886rr 于 2017-8-7 11:06 编辑

回复 8# codegay
之前考虑过,后来觉得BLAKE2不是很常用,而且在安卓手机上对该算法的支持也不是很好,就砍掉了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 23:46 , Processed in 0.014504 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表