Android 应用程序崩溃时它比较两个 MD5 哈希值在 do,while

发布时间: 2016/9/25 22:49:37
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

我已经创建了 android ,基本上确实蛮力破解密码的应用程序。我有放的资产 (file.txt) 文件夹中的词典文件。我计算哈希的文件并比较它与用户输入 (这也是 MD5 哈希值) 中,但该应用程序崩溃时我按提交 button

应用程序运行完美时唯一字符串匹配完成与用户输入和文件内容 (当不做 md5 哈希)。请帮助...

这里是 mainactivity.java 文件

package com.example.root.project;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.content.Intent;
import android.widget.EditText;
import android.widget.Toast;
import android.widget.Button;
import android.view.View;
import android.widget.TextView;
import java.io.IOException;
import java.security.MessageDigest;
import java.io.InputStream;
import java.io.BufferedReader;
import java.security.NoSuchAlgorithmException;
import android.content.res.AssetManager;
import java.io.InputStreamReader;

public class MainActivity extends AppCompatActivity {

    Button sub;
    EditText mEdit1;
    TextView txtView;
    InputStream in;
    BufferedReader reader;
    String line;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

             sub = (Button) findViewById(R.id.button);
             mEdit1 = (EditText) findViewById(R.id.editText);
             txtView=(TextView)findViewById(R.id.textView2);

         try{
             in = this.getAssets().open("file.txt");
             reader = new BufferedReader(new InputStreamReader(in));
            }

          catch(IOException e)
            {
             e.printStackTrace();
            }


        sub.setOnClickListener(new View.OnClickListener() {

            String check1;
            public void onClick(View v) {

                      //"**user enters MD5 hash**" 
                      String message = mEdit1.getText().toString();
               try {

                    // **" reading line by line and comparing hashes "**
                   do {
                       line = reader.readLine();
                       check1=md5(line);
                       if(message.equals(check1))
                            {
                                 txtView.setText("password cracked : "+line);
                                 return;
                            }

                        }while(line!=null);

               }
               catch (IOException e) {
                   e.printStackTrace();

               }

            }
    });
    }

    public static final String md5(final String s) {
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++) {
                String h = Integer.toHexString(0xFF & messageDigest[i]);
                while (h.length() < 2)
                    h = "0" + h;
                hexString.append(h);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }


}

解决方法 1:

我的猜测是,还有一个问题与你的循环,但我们不能确定的直到我们看到您的 logcat 输出。然而,我注意到以下内容︰

do {
    line = reader.readLine();
    check1=md5(line);
    if(message.equals(check1))
    {
        txtView.setText("password cracked : "+line);
        return;
    }
} while(line!=null);

问题是你要 line 从读者,然后得到的 MD5 哈希,检查该散列,然后确保将 line 继续之前并不是 null。您需要确保 line 尝试散列它之前不为 null。

while ((line = reader.readLine()) != null) {
    check1=md5(line);
    if(message.equals(check1))
    {
        txtView.setText("password cracked : "+line);
        return;
    }
}

这将得到 line 和执行空检查前去哈希。

如果这不起作用,然后我们需要您的错误输出。

官方微信
官方QQ群
31647020