Android數據加密之MD5加密

前言:

      項目中不管是密碼的存儲或者說判斷文件是不是同一文件,都會用到MD5算法,今天來總結一下MD5加密算法。html

什麼是MD5加密?

     MD5英文全稱「Message-Digest Algorithm 5」,翻譯過來是「消息摘要算法5」,由MD二、MD三、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加密簡單的總結到此爲止。

相關文章
相關標籤/搜索