Android資料加密之MD5加密

總李寫程式碼發表於2016-09-20

前言:

      專案中無論是密碼的儲存或者說判斷檔案是否是同一檔案,都會用到MD5演算法,今天來總結一下MD5加密演算法。

什麼是MD5加密?

     MD5英文全稱“Message-Digest Algorithm 5”,翻譯過來是“訊息摘要演算法5”,由MD2、MD3、MD4演變過來的,是一種單向加密演算法,是不可逆的一種的加密方式。

     其他幾種加密方式:

MD5加密有哪些特點?

  • 壓縮性:任意長度的資料,算出的MD5值長度都是固定的。

  • 容易計算:從原資料計算出MD5值很容易。

  • 抗修改性:對原資料進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。

  • 強抗碰撞:已知原資料和其MD5值,想找到一個具有相同MD5值的資料(即偽造資料)是非常困難的。

MD5應用場景:

  • 一致性驗證

  • 數字簽名

  • 安全訪問認證

MD5加密演算法實現:

1.)計算字串MD5值

    public static String md5(String string) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest(string.getBytes());
            String result = "";
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

2.)計算檔案的MD5值

 // 計算檔案的 MD5 值
    public static String md5(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;
    }

 或者採用nio的方式

   public static String md5(File file) {
        String result = "";
        FileInputStream in = null;
        try {
            in = new FileInputStream(file);
            MappedByteBuffer byteBuffer = in.getChannel().map(FileChannel.MapMode.READ_ONLY, 0, file.length());
            MessageDigest md5 = MessageDigest.getInstance("MD5");
            md5.update(byteBuffer);
            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;
    }

MD5加密安全性探討:

      雖然說MD5加密本身是不可逆的,但並不是不可破譯的,網上有關MD5解密的網站數不勝數,破解機制採用窮舉法,就是我們平時說的跑字典。所以如何才能加大MD5破解的難度呢?

1.)對字串多次MD5加密

    public static String md5(String string, int times) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        String md5 = md5(string);
        for (int i = 0; i < times - 1; i++) {
            md5 = md5(md5);
        }
        return md5(md5);
    }

2.)MD5加鹽

     加鹽的方式也是多種多樣

  • string+key(鹽值key)然後進行MD5加密

  • 用string明文的hashcode作為鹽,然後進行MD5加密
  • 隨機生成一串字串作為鹽,然後進行MD5加密

    public static String md5(String string, String slat) {
        if (TextUtils.isEmpty(string)) {
            return "";
        }
        MessageDigest md5 = null;
        try {
            md5 = MessageDigest.getInstance("MD5");
            byte[] bytes = md5.digest((string + slat).getBytes());
            String result = "";
            for (byte b : bytes) {
                String temp = Integer.toHexString(b & 0xff);
                if (temp.length() == 1) {
                    temp = "0" + temp;
                }
                result += temp;
            }
            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

總結:

    MD5加密簡單的總結到此為止。

 

相關文章