Android で文字列またはファイルの MD5 暗号化を実装する

MD5 情報ダイジェスト アルゴリズムの概要

  • 広く使用されている暗号化ハッシュ関数である MD5 (メッセージ ダイジェスト アルゴリズム) は、128 ビット (16 バイト) のハッシュ値 (ハッシュ値) を生成して、情報送信の完全性と一貫性を保証します。
  • 計算された MD5 値が繰り返される可能性がありますが、その可能性は非常に低いです。
  • 暗号化プロセスはほぼ不可逆的であり、衝突クラッキング用に巨大な Key-Value データベースが維持されない限り、ロックを解除することはほぼ不可能です。
  • MD5 で暗号化される文字列は固定されており、同じ文字列またはファイルを暗号化しても結果は変わりません。

Android でのコードの実装

  • 次のコードは、一般的な 32 ビット md5 計算を実装しています。計算結果は、生成された文字を長さ 32 の 16 進文字列として保持します。これは、開発で必要な場合に直接変換して使用できます。
    public class Md5Util {
        public static String get(String text) {
            String result = null;
            try {
                MessageDigest md = MessageDigest.getInstance("MD5");
                byte[] digest = md.digest(text.getBytes());
                result = toHexString(digest);
            } catch (NoSuchAlgorithmException ex) {
                ex.printStackTrace();
            }
            return result;
        }
    
        public static String get(InputStream inputStream) {
            String result = null;
            try {
                byte[] buffer = new byte[8192];
                int len;
                MessageDigest md = MessageDigest.getInstance("MD5");
                while ((len = inputStream.read(buffer)) != -1) {//分多次读入文件,占用内存比较少
                    md.update(buffer, 0, len);
                }
                inputStream.close();
    
                byte[] digest = md.digest();
                result = toHexString(digest);
            } catch (Exception ex) {
                ex.printStackTrace();
                if (inputStream != null) {
                    try {
                        inputStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return result;
        }
    
        public static String get(File file) {
            String result = null;
            try {
                result = get(new FileInputStream(file));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            return result;
        }
    
        private static String toHexString(byte[] digest) {
            StringBuilder sb = new StringBuilder();
            String hexStr;
            for (byte b : digest) {
                hexStr = Integer.toHexString(b & 0xFF);//& 0xFF处理负数
                if (hexStr.length() == 1) {//长度等于1,前面进行补0,保证最后的字符串长度为32
                    hexStr = "0" + hexStr;
                }
                sb.append(hexStr);
            }
    
            return sb.toString();
        }
    }

おすすめ

転載: blog.csdn.net/qq_19942717/article/details/127555520