Android 应用程序在 do while 循环中比较两个 MD5 哈希值时崩溃
Android app crashes when it compares two MD5 hashes in do while loop
我创建了一个 android 应用程序,它基本上可以暴力破解密码 cracking.I 并将字典文件放在资产文件夹 (file.txt) 中。我从中计算哈希值文件并将其与用户输入(也是 MD5 哈希)进行比较,但是当我按下提交按钮时应用程序崩溃了。
当仅对用户输入和文件内容进行字符串匹配时(未进行 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 "";
}
}
我猜你的循环有问题,但在看到你的 logcat 输出之前我们不能确定。但是,我注意到以下几点:
do {
line = reader.readLine();
check1=md5(line);
if(message.equals(check1))
{
txtView.setText("password cracked : "+line);
return;
}
} while(line!=null);
问题是您从 reader 获取 line
,然后获取 MD5 哈希,检查该哈希,然后在继续之前确保 line
不为空.在尝试对其进行哈希处理之前,您需要确保 line
不为空。
while ((line = reader.readLine()) != null) {
check1=md5(line);
if(message.equals(check1))
{
txtView.setText("password cracked : "+line);
return;
}
}
这将得到 line
并在尝试散列之前执行空检查。
如果这不起作用,那么我们将需要您的错误输出。
我创建了一个 android 应用程序,它基本上可以暴力破解密码 cracking.I 并将字典文件放在资产文件夹 (file.txt) 中。我从中计算哈希值文件并将其与用户输入(也是 MD5 哈希)进行比较,但是当我按下提交按钮时应用程序崩溃了。
当仅对用户输入和文件内容进行字符串匹配时(未进行 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 "";
}
}
我猜你的循环有问题,但在看到你的 logcat 输出之前我们不能确定。但是,我注意到以下几点:
do {
line = reader.readLine();
check1=md5(line);
if(message.equals(check1))
{
txtView.setText("password cracked : "+line);
return;
}
} while(line!=null);
问题是您从 reader 获取 line
,然后获取 MD5 哈希,检查该哈希,然后在继续之前确保 line
不为空.在尝试对其进行哈希处理之前,您需要确保 line
不为空。
while ((line = reader.readLine()) != null) {
check1=md5(line);
if(message.equals(check1))
{
txtView.setText("password cracked : "+line);
return;
}
}
这将得到 line
并在尝试散列之前执行空检查。
如果这不起作用,那么我们将需要您的错误输出。