概述:
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值了。