标题: 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
原创代码:- package com.android.jhash;
-
- /**开关解析类包*/
- import gnu.getopt.LongOpt;
- import gnu.getopt.Getopt;
-
- /**IO 操作类包*/
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.IOException;
-
- /**安全框架类包*/
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
-
- /**实用工具类包*/
- import java.util.zip.CRC32;
-
- /**数学计算类包*/
- import java.math.BigInteger;
-
-
- /**Main主类
- * @author Happy from BatHome
- * @date Thu Aug 03 2017 20:11:16 GMT+0800
- * @description jhash.jar
- */
- public class Main
- {
- private static final String HELP_INFORMATION =
- ""
- + "JHASH.JAR - JAVA CONSOLE HASH TOOL, COPYRIGHT@2017~2019 BY HAPPY\n"
- + "-----------------------------------------------------------------------\n"
- + "Usage instructions:\n"
- + " java -jar jhash.jar [input] (-F) (-W) -H [hash type]\n"
- + " java -Xms1024m -Xmx1024m -jar jhash.jar ...\n"
- + "-----------------------------------------------------------------------\n"
- + "General options:\n"
- + " --help, -h Show help information.\n"
- + " --file, -F Calculate the input as a file.\n"
- + " --whole, -W Calculate the whole hash type.\n"
- + " --hashtype, -H Set the hash type.\n\n"
- + "Available hash types:\n"
- + " MD5, CRC32, SHA-1, MD2, SHA-256, SHA-384, SHA-512\n\n"
- + "Official website:\n"
- + " http://www.bathome.net/thread-44921-1-1.html\n"
- + "-----------------------------------------------------------------------\n"
- + "AT LEAST JRE1.6, VERSION: 1.0.1.170807\n";
-
-
- /**获取字符串HASH值
- * @param str
- * @param hashType
- * @return
- * @throws Exception
- */
- private static String getStringHash(String hashString, String hashType) throws Exception
- {
- try
- {
- // 单独针对CRC32生成摘要算法
- if(hashType.equals("CRC32"))
- {
- CRC32 objectCRC32 = new CRC32();
- objectCRC32.update(hashString.getBytes());
- // 返回CRC32摘要分支
- return Long.toHexString(objectCRC32.getValue());
- }
-
- // 生成HASH摘要算法
- MessageDigest messageDigest = MessageDigest.getInstance(hashType);
- // 获取二进制
- messageDigest.update(hashString.getBytes());
- // 返回16进制 HASH字串
- return new BigInteger(1, messageDigest.digest()).toString(16);
- }
- catch (Exception e)
- {
- // 抛出摘要错误
- throw new Exception("HASH encryption error!");
- }
- }
-
-
- /**获取文件HASH值
- * @param hashFile
- * @param hashType
- * @return
- * @throws IOException
- * @throws NoSuchAlgorithmException
- */
- private static String getFileHash(String hashFile, String hashType) throws IOException, NoSuchAlgorithmException
- {
- try
- {
- // 创建文件流
- File fp = new File(hashFile);
- // 创建输入流
- FileInputStream inStream = new FileInputStream(fp);
- // 缓存容器
- byte[] byteBuffer = new byte[4096];
- // 每次读入缓存的长度
- int readLength;
-
- // 单独针对CRC32生成文件摘要算法
- if(hashType.equals("CRC32"))
- {
- CRC32 objectCRC32 = new CRC32();
- while ((readLength=inStream.read(byteBuffer)) != -1)
- {
- objectCRC32.update(byteBuffer, 0, readLength);
- }
- // 关闭输入流
- inStream.close();
- // 返回CRC32文件摘要分支
- return Long.toHexString(objectCRC32.getValue());
- }
-
- // 生成HASH摘要算法
- MessageDigest messageDigest = MessageDigest.getInstance(hashType);
- while ((readLength=inStream.read(byteBuffer)) != -1)
- {
- messageDigest.update(byteBuffer, 0, readLength);
- }
- // 关闭输入流
- inStream.close();
-
- // 返回该文件的16进制 HASH字串
- return new BigInteger(1, messageDigest.digest()).toString(16);
- }
- catch (IOException e)
- {
- // 抛出摘要错误
- throw new IOException("HASH file encryption error!");
- }
- }
-
-
- /**
- * @param args
- * @throws Exception
- */
- public static void main(String[] args) throws Exception
- {
- //参数不足时,抛出使用说明
- if (args.length < 1)
- {
- System.out.println(HELP_INFORMATION);
- return;
- }
-
- // 设置长选项开关
- LongOpt[] lopts =
- {
- new LongOpt("help", LongOpt.NO_ARGUMENT, null, 'h'),
- new LongOpt("file", LongOpt.NO_ARGUMENT, null, 'F'),
- new LongOpt("whole", LongOpt.NO_ARGUMENT, null, 'W'),
- new LongOpt("hashtype", LongOpt.REQUIRED_ARGUMENT, null, 'H')
- };
-
- // 创建开关解析对象
- Getopt g = new Getopt("JHASH", args, "WFH:h", lopts);
-
- // 缺省模式为 字符串HASH模式
- boolean hashFileFlag = false;
-
- // 完全HASH模式
- boolean hashWholeFlag = false;
-
- // 缺省HASH类型为 MD5摘要
- String hashType = "MD5";
-
- String hashObject = null;
-
- int c;
- // 执行开关解析
- while ((c=g.getopt()) != -1)
- {
- switch(c)
- {
- case 'h':
- // 抛出使用说明
- System.out.println(HELP_INFORMATION);
- return;
-
- case 'F':
- // 开启文件HASH模式
- hashFileFlag = true;
- break;
-
- case 'W':
- // 抛出使用说明
- hashWholeFlag = true;
- break;
-
- case 'H':
- // 获取HASH类型
- hashType = g.getOptarg().toUpperCase();
- if(hashType.equals("SHA1"))
- {
- hashType = "SHA-1";
- }
- else if(hashType.equals("SHA256"))
- {
- hashType = "SHA-256";
- }
- else if(hashType.equals("SHA384"))
- {
- hashType = "SHA-384";
- }
- else if(hashType.equals("SHA512"))
- {
- hashType = "SHA-512";
- }
- else if(hashType.equals("MD5"))
- {
- }
- else if(hashType.equals("CRC32"))
- {
- }
- else if(hashType.equals("SHA-1"))
- {
- }
- else if(hashType.equals("SHA-256"))
- {
- }
- else if(hashType.equals("SHA-384"))
- {
- }
- else if(hashType.equals("SHA-512"))
- {
- }
- else
- {
- // 不支持的、错误的 HASH类型
- System.out.printf("Error hash type '%s', or unsupported hash type.\n", hashType);
- return;
- }
- break;
-
-
- default:
- // 遇到无法解析的开关,操作中断
- System.out.printf("You can try '-h' or '--help' to get help information.\n", (char)g.getOptopt());
- return;
- }
- }
-
- // 提取未解析的参数作为 HASH对象
- if(g.getOptind() < args.length)
- {
- hashObject = args[g.getOptind()];
- }
- else
- {
- System.out.println("Needs input object!");
- return;
- }
-
- // 如果为文件模式,先判断文件是否存在
- if(hashFileFlag)
- {
- File fp = new File(hashObject);
- if(! fp.exists())
- {
- System.out.printf("The file \"%s\" is not exist.\n", hashObject);
- return;
- }
- }
-
- // 如果是全HASH模式
- if(hashWholeFlag)
- {
- if(hashFileFlag)
- {
- System.out.println
- (""
- + "[File hash]\n"
- + "MD5 : " + getFileHash(hashObject, "MD5" ) + "\n"
- + "CRC32 : " + getFileHash(hashObject, "CRC32" ) + "\n"
- + "SHA-1 : " + getFileHash(hashObject, "SHA-1" ) + "\n"
- //+ "MD2 : " + getFileHash(hashObject, "MD2" ) + "\n"
- + "SHA-256: " + getFileHash(hashObject, "SHA-256") + "\n"
- + "SHA-384: " + getFileHash(hashObject, "SHA-384") + "\n"
- + "SHA-512: " + getFileHash(hashObject, "SHA-512") + "\n"
- );
-
- }
- else
- {
- System.out.println
- (""
- + "[String hash]\n"
- + "MD5 : " + getStringHash(hashObject, "MD5" ) + "\n"
- + "CRC32 : " + getStringHash(hashObject, "CRC32" ) + "\n"
- + "SHA-1 : " + getStringHash(hashObject, "SHA-1" ) + "\n"
- //+ "MD2 : " + getStringHash(hashObject, "MD2" ) + "\n"
- + "SHA-256: " + getStringHash(hashObject, "SHA-256") + "\n"
- + "SHA-384: " + getStringHash(hashObject, "SHA-384") + "\n"
- + "SHA-512: " + getStringHash(hashObject, "SHA-512") + "\n"
- );
- }
- return;
- }
-
- // 对文件模式,执行 getFileHash方法
- if(hashFileFlag)
- {
- System.out.printf("%s File Code: %s\n", hashType, getFileHash(hashObject, hashType));
- }
- else
- {
- System.out.printf("%s String Code: %s\n", hashType, getStringHash(hashObject, hashType));
- }
- return;
- }
- }
复制代码
作者: 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秒- PS C:\Test> Measure-Command {Get-FileHash C:\cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso -Algorithm MD5}
-
-
- Days : 0
- Hours : 0
- Minutes : 0
- Seconds : 20
- Milliseconds : 833
- Ticks : 208332954
- TotalDays : 0.000241126104166667
- TotalHours : 0.0057870265
- TotalMinutes : 0.34722159
- TotalSeconds : 20.8332954
- TotalMilliseconds : 20833.2954
-
- PS C:\Test> (Get-Item C:\cn_windows_server_2012_r2_with_update_x64_dvd_6052725.iso).Length/(1024*1024*1024)
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |