Android中MD5加密算法

概述:

MD5英文全称“Message-Digest Algorithm 5”,翻译过来是“消息摘要算法5”,由MD2、MD3、MD4演变过来的,是一种单向加密算法,是不可逆的一种的加密方式。

特点:

  • 压缩性:任意长度的数据,算出的MD5值长度都是固定的,btye经过转化后字符串的长度都是32位长。

  • 容易计算:从原数据计算出MD5值很容易。经过MD5算法得到一个字节数组,按一定的规则转化这个字节数据,我们就可以看到MD5值了。

  • 抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

  • 强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的

使用:看代码
public class MD5Activity extends AppCompatActivity {
    private EditText editText ;
    @Override
    protected void onCreate( @Nullable Bundle savedInstanceState ) {
        super.onCreate( savedInstanceState ) ;
        setContentView( R.layout.md5_activty_layout ) ;
        editText = (EditText) findViewById( R.id.editText);
    }

    /**
     * 按钮监听方法
     * @param view
     */
    public void mD5Code( View view ) {
        String s = editText.getText().toString() ;
        try {
            MessageDigest md = MessageDigest.getInstance( "MD5") ;
            byte[] data = md.digest( s.getBytes()) ;
            String ss = byte2String( data ) ;
            System.out.println("s = "+ ss +  "   ////    " + " len = "+ ss.length() );
            editText.setText( ss + "=" +ss.length());
        } catch ( NoSuchAlgorithmException e) {
            e.printStackTrace() ;
        }
    }

    /**
     * 字节转换成字符串
     */
    private String byte2String( byte[] data ){
        String s = "" ;
        for ( int i = 0 ; i < data.length ; i++ ){
            int veula = data[i] & 0xff ; //按位与
            if ( veula < 16 ){
                s += "0" ;  //要在前面加上个0
            }
            s += Integer.toHexString( veula ); //链接字符串
        }
        //第二种转化方法
//        for (byte b : data) {
//            String temp = Integer.toHexString(b & 0xff);
//            if (temp.length() == 1) {
//                temp = "0" + temp;
//            }
//            s += temp;
//        }

        return  s ;
    }

    /**
     * 计算文件的 MD5 值
     */
    public static String fileMd5( File file ) {
        if (file == null || !file.isFile() || !file.exists()) {
            return "";
        }
        FileInputStream in = null;
        String result = "";
        byte buffer[] = new byte[8192];
        int len;
        try {
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            in = new FileInputStream(file);
            while ((len = in.read(buffer)) != -1) {
                md5.update(buffer, 0, len);  //添加内容
            }
            byte[] bytes = md5.digest();     //把添加进去的内容获取字节数组
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(null!=in){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }

    /**
     * 加密文件
     */
    private void getDir() throws Exception {
        //获取SD卡上的DONLOAD的目录
        File file = Environment.getExternalStoragePublicDirectory( Environment.DIRECTORY_DOWNLOADS ) ;
        //获取制定目录下的第一的文件
        file = file.listFiles()[0] ;
        //获取MD5码的实例
        MessageDigest md = MessageDigest.getInstance(" MD5") ;
        //设置加密的内容
        md.update( new FileInputStream(file).getChannel().map(FileChannel.MapMode.READ_ONLY , 0 , file.length() ));
        //获取MD5码的值
        byte[] data = md.digest( ) ;
        String sss = byte2String( data );
        System.out.println( sss ) ;

  }
 }
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:id="@+id/editText"
        android:layout_height="wrap_content"
        android:layout_width="match_parent"/>

    <Button
        android:onClick="mD5Code"
        android:id="@+id/md5_action_but"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="MD5"/>

</LinearLayout>
安全性:
 虽然说MD5加密本身是不可逆的,但并不是不可破译的,网上有关MD5解密的网站数不胜数,破解机制采用穷举法,就是我们平时说的跑字典。所以如何才能加大MD5破解的难度呢? 看代码:
/**
 * 加强安全性
 * @param string
 * @return
 */
public static String md5(String string) {
    if (TextUtils.isEmpty(string)) {
        return "";
    }
    String md5 = md5(string);
    for (int i = 0; i < 10; i++) {
        md5 = md5(md5);
    }
    return md5(md5);
}

总结:MD5加密是不可逆的,主要使用MeessageDigest.getInstance("MD5")获取加密工具,然后把要加密的内容以byte或String形式添加加密中meessageDigest.digest(byte)或meessageDigest.upData(String , 0 , Stiang.lenght),meessageDigest.digset()得到byte字节,经过一定的规则转化
    /**
     * 字节转换成字符串
     */
    private String byte2String( byte[] data ){
        String s = "" ;
        for ( int i = 0 ; i < data.length ; i++ ){
            int veula = data[i] & 0xff ; //按位与
            if ( veula < 16 ){
                s += "0" ;  //要在前面加上个0
            }
            s += Integer.toHexString( veula ); //链接字符串
        }
        //第二种转化方法
//        for (byte b : data) {
//            String temp = Integer.toHexString(b & 0xff);
//            if (temp.length() == 1) {
//                temp = "0" + temp;
//            }
//            s += temp;
//        }

        return  s ;
    }
我们就可以看见MD5值了。


猜你喜欢

转载自blog.csdn.net/xiaol206/article/details/71948074