JAVA第三方哈希工具: jhash
[i=s] 本帖最后由 happy886rr 于 2017-8-7 12:05 编辑 [/i]jhash.jar (JAVA CONSOLE HASH TOOL, BY HAPPY, VERSION 1.0.1.170807)
[1.0.1.170807版] :修复数个漏洞,并优化手机下的运行速度。
附件下载:[attach]10803[/attach]
[quote]
摘要:
===================================================
控制台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包。
===================================================
[img]http://i4.bvimg.com/1949/4105a38ab1250f01.png[/img]
要求:
---------------------------------------------------------------------------------
JRE1.6及以上 JAVA运行时环境
---------------------------------------------------------------------------------
手机端运行方法:
---------------------------------------------------------------------------------
请使用 ej脚本运行,参见教程[url]http://www.bathome.net/thread-44950-1-1.html[/url]
备注: 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:
[url]http://www.bathome.net/thread-44921-1-1.html[/url]
---------------------------------------------------------------------------------
AT LEAST JRE1.6, VERSION: 1.0.1.170807[/quote]
原创代码:[code]
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;
}
}
[/code] [i=s] 本帖最后由 happy886rr 于 2017-8-4 09:08 编辑 [/i]
[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=200817&ptid=44615]3#[/url] [i]老刘1号[/i] [/b]
昨天忘了上传附件,今天补上了JHASH.7z,更新大GB文件HASH溢出漏洞,请安装jdk运行jhash.jar, 测试获取hash速度比C语言都快,java优化的太好了。 [b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=201887&ptid=44921]2#[/url] [i]happy886rr[/i] [/b]
能否给些测试数据?
比如哪个版本的JDK、多大的文件、C和jhash分别耗时多少... :lol 我觉得性能接近C可以理解,如果是超过那就要看C的代码了。 提供一个数据做比较:
PowerShell的Get-FileHash计算一个5GB文件的MD5耗时20秒[code]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[/code] [i=s] 本帖最后由 happy886rr 于 2017-8-4 17:20 编辑 [/i]
[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=201899&ptid=44921]5#[/url] [i]PS2.0[/i] [/b]
5GB耗时20秒? 每秒读取速度超过240M,这是固态硬盘吗?SSD、SHDD、HDD ?
如果我用更好的SSD颗粒,那岂不是速度更快!组阵列瞬间读入内存,再做md5,只需要三分之一的时间。
md5摘要计算耗时不多,耗时的是文件的读取。 [b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=201903&ptid=44921]6#[/url] [i]happy886rr[/i] [/b]
是SSD
你说的太高深了我不懂
jhash比C快主要是哪部分快呢? [url]https://blake2.net/[/url]
[b]
[quote]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. [/quote][/b] [i=s] 本帖最后由 happy886rr 于 2017-8-7 11:06 编辑 [/i]
[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=201937&ptid=44921]8#[/url] [i]codegay[/i] [/b]
之前考虑过,后来觉得BLAKE2不是很常用,而且在安卓手机上对该算法的支持也不是很好,就砍掉了。
页:
[1]