Android中MD5加密算法

来源:互联网 发布:淘宝公司介绍模板 编辑:程序博客网 时间:2024/04/30 09:04

概述:

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值了。


0 0
原创粉丝点击