批处理之家's Archiver

happy886rr 发表于 2017-8-3 22:26

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]

happy886rr 发表于 2017-8-4 09:00

[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优化的太好了。

Batcher 发表于 2017-8-4 10:02

[b]回复 [url=http://www.bathome.net/redirect.php?goto=findpost&pid=201887&ptid=44921]2#[/url] [i]happy886rr[/i] [/b]


能否给些测试数据?
比如哪个版本的JDK、多大的文件、C和jhash分别耗时多少...

codegay 发表于 2017-8-4 14:34

:lol 我觉得性能接近C可以理解,如果是超过那就要看C的代码了。

PS2.0 发表于 2017-8-4 16:06

提供一个数据做比较:
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]

happy886rr 发表于 2017-8-4 17:01

[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摘要计算耗时不多,耗时的是文件的读取。

PS2.0 发表于 2017-8-4 21:33

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=201903&ptid=44921]6#[/url] [i]happy886rr[/i] [/b]


是SSD
你说的太高深了我不懂
jhash比C快主要是哪部分快呢?

codegay 发表于 2017-8-6 07:55

[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]

happy886rr 发表于 2017-8-6 22:03

[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]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.