Android--消息摘要MD5,SHA加密

news/2024/7/6 1:31:58 标签: 消息摘要, md5, sha1, 加密, android
使用场景:
  • 对用户密码进行md5 加密后保存到数据库里
  • 软件下载站使用消息摘要计算文件指纹,防止被篡改
  • 数字签名
  • 百度云,360网盘等云盘的妙传功能用的就是sha1
  • Eclipse和Android Studio开发工具根据sha1值来判断v4,v7包是否冲突
  • 据说银行的密码使用的就是MD5加密(因为MD5具有不可逆性)
  • 病毒查杀,把每个病毒文件或apk进行MD5后得到一个特征码,拿着特征码去跟病毒数据库对比,特征码一致说明该文件是病毒
  • Git版本控制也使用到了sha1
消息摘要是固定长度,与消息内容长度无关,MD5后的摘要结果位数:16 位指的是字节位数,128 位指的是比特位,32 位指的结果转换成16 进制展示的字符位数。

主要就下面三句话:
//常用算法:MD5、SHA、CRC
MessageDigest digest = MessageDigest.getInstance("MD5");
byte[] result = digest.digest(content.getBytes());
//消息摘要的结果一般都是转换成16 进制字符串形式展示
String hex = Hex.encode(result);
//MD5 结果为16 字节(128 个比特位)、转换为16 进制表示后长度是32 个字符
//SHA 结果为20 字节(160 个比特位)、转换为16 进制表示后长度是40 个字符

package com.example.xiaobai.aes;

import java.security.MessageDigest;

/**
 * Created by xiaobai on 2017/12/8/008.
 */

public class MD5Utils {

    public static String encode(String pwd) {
        // MessageDigest 消息摘要
        try {
            MessageDigest digester = MessageDigest.getInstance("MD5");
            // 加密,将要加密的字符串转换成字节数组
            byte[] digest = digester.digest(pwd.getBytes());

            StringBuffer buffer = new StringBuffer();
            // 0000-0101
            // 1111-1111
            // 0000-0101
            for (byte b : digest) {
                // 0xff 表示低8 位
                int number = b & 0xff;
                // int 32 位一个int 是四个字节一个字节8 位
                // 任何一个值& 等于0
                // & 1 = 1
                String hexString = Integer.toHexString(number);
                if (hexString.length() == 1) {
                    buffer.append("0" + hexString);
                } else {
                    buffer.append(hexString);
                }
            }
            System.out.println("密码长度---" + buffer.toString().length());
            System.out.println("密码---" + buffer.toString());
            return buffer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }
}

package com.example.xiaobai.aes;

/**
 * Created by xiaobai on 2017/12/8/008.
 */

/**
 * 字节数组与16进制字符串转换工具
 */
public class Hex {

    private static final char[] HEX_CHAR = { '0', '1', '2', '3', '4', '5', '6',
            '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };

    /**
     * 字节数组转换成16进制字符串
     */
    public static String encode(byte[] bytes) {
        if (bytes == null || bytes.length == 0) {
            return null;
        }

        StringBuffer sb = new StringBuffer(bytes.length * 2);
        // 27对应的十六进制为1b,对应的二进制是00011011
        // 取高位和低位:00011011-》0001,1011-》1,b
        for (int i = 0; i < bytes.length; ++i) {
            // 取高位:跟0xf0做与运算后再右移4位
            int high = (bytes[i] & 0xf0) >> 4;// 0xf0: 11110000
            // 取低位:跟0x0f做与运算
            int low = bytes[i] & 0x0f;// 0x0f: 00001111
            // 字符映射
            sb.append(HEX_CHAR[high]).append(HEX_CHAR[low]);
        }
        return sb.toString();
    }

    /**
     * @param hex 16进制字符
     */
    public static byte[] decode(String hex) {
        if (hex == null || hex.length() == 0) {
            return null;
        }

        // 16进制转byte,长度减半,"1b"-->27
        int len = hex.length() / 2;
        byte[] result = new byte[len];
        String highStr = null;
        String lowStr = null;
        int high = 0;
        int low = 0;
        for (int i = 0; i < len; i++) {
            // 高位值
            highStr = hex.substring(i * 2, i * 2 + 1);// "1b"的高位为"1"
            high = Integer.parseInt(highStr, 16);// 高位转为10进制
            // 低位值
            lowStr = hex.substring(i * 2 + 1, i * 2 + 2);// "1b"的低位为"b"
            low = Integer.parseInt(lowStr, 16);// 低位转为10进制
            // 合计值
            result[i] = (byte) ((high << 4) + low);// 相当于:(高位*16) + 低位
        }
        return result;
    }

}

package com.example.xiaobai.aes;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String text = "hello MD5!";
        String result = MD5Utils.encode(text);
        Log.i("MD5",result);
    }
}

打印结果:
12-08 09:53:08.186 6545-6545/com.example.xiaobai.aes I/MD5: f350b8db461c95e347453ad01a587878



http://www.niftyadmin.cn/n/828911.html

相关文章

const枚举 ts_Typescript运行时错误:无法读取undefined(enum)的属性

在Typescript中有两种枚举&#xff1a;>经典枚举&#xff1a;在TS到JS转换期间,它们被转换为真实对象,因此它们在运行时存在.enum Response {No 0,Yes 1,}const yes Response.Yes; // Works at runtimeconst nameOfYes Response[yes]; // Also works at runtime because…

java树状图结构的源码_树形结构java代码以及结果

oracle 11g 树形结构java代码以及结果是本文探讨的主要内容。一、start with org_id 条件1 prior parent_id son_id; 的作用这个就是为了把树形结构全部查出来&#xff0c;树的目录就放在同一张表中,如1|--2|--3|--4|--5|--6|--7|--8|--9|--10这样的结构怎么查出来呢&#…

Android--数字签名和数字证书

一、数字签名 1. 概述 数字签名是非对称加密与数字摘要的组合应用 2. 应用场景 校验用户身份&#xff08;使用私钥签名&#xff0c;公钥校验&#xff0c;只要用公钥能校验通过&#xff0c;则该信息一定是私钥持有者发布的&#xff09;校验数据的完整性&#xff08;用解密后的消…

python跟我学_跟我学Python(六)

第6课文件读写读写文件是程序的常规功能&#xff0c;我们看看python如何来处理。首先&#xff0c;请准备一个文件&#xff0c;例如ex15_sampley.txt&#xff0c;随便输入一些内容&#xff0c;并保存。我们将打开这个文件&#xff0c;并读取其中的内容。但是&#xff0c;我们并不…

Dijkstra求最短路(最短模板)

给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c;所有边权均为正值。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出-1。 输入格式 第一行包含整数n和m。 接下来m行每行包含三个整数x&#xff0c;y&…

Android--Https编程

概述 SSL(Secure Sockets Layer 安全套接层)&#xff0c;为网景公司(Netscape)所研发&#xff0c;用以保障在Internet 上数据传输之安全&#xff0c;利用数据加密(Encryption)技术&#xff0c;可确保数据在网络上之传输过程中不会被截取及窃听。一般通用之规格为40 bit 之安全标…

Android 防截屏处理

Android开发中登录界面和其他一些比较敏感的界面不允许截屏 具体设置办法比较简单&#xff1a; getWindow().setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE); 在setConventView()之前设置此属性还有另外一个功能&#xff0c;就是…

Android--进程间通信(Binder)

Android系统提供了一些通用服务&#xff0c;比如音乐打电话发短信&#xff0c;WIFI&#xff0c;定位&#xff0c;输入法&#xff0c;传感器等。应用程序与这些通用服务运行在不同的进程中&#xff0c;如果应用程序想要与这些通用服务交互就要涉及到进程间通信&#xff0c;Binde…