zoukankan      html  css  js  c++  java
  • MD5加密算法

    今天建民老师讲解了系统的安全性问题,涉及了MD5加密算法,之前只是使用过几次,没有特别了解,我上网查询了相关的资料,做一下总结。

    MD5的作用

    ①一致性检验。

    ②数字签名。

    ③安全访问认证,这个就是平时系统设计的问题了。

    在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了

    md5是唯一的吗?

    md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。

    也就是一个原始数据,只对应一个md5值;

    但是一个md5值,可能对应多个原始数据。

    md5不能破解吗?

    md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。

    但是如果使用暴力破解,那就另说了。

    md5特点:

    1.长度固定:

    不管多长的字符串,加密后长度都是一样长。

    作用:方便平时信息的统计和管理。

    2.易计算:

    字符串和文件加密的过程是容易的。

    作用: 开发者很容易理解和做出加密工具。

    3.细微性

    一个文件,不管多大,小到几k,大到几G,你只要改变里面某个字符,那么都会导致MD5值改变。

    作用:很多软件和应用在网站提供下载资源,其中包含了对文件的MD5码,用户下载后只需要用工具测一下下载好的文件,通过对比就知道该文件是否有过更改变动。

    4.不可逆性

    你明明知道密文和加密方式,你却无法反向计算出原密码。

    作用:基于这个特点,很多安全的加密方式都是用到.大大提高了数据的安全性。

    Java的MD5加密算法:

    import java.security.MessageDigest;
    
    public class TestMD5 {
    // MD5加密。32位   
    public static String str_toMD5(String inStr) {
        MessageDigest md5 = null;
        try {
                md5 = MessageDigest.getInstance("MD5");
        } catch (Exception e) {
                System.out.println(e.toString());
                e.printStackTrace();
                return "";
        }
        char[] charArray = inStr.toCharArray();
        byte[] byteArray = new byte[charArray.length];
        for (int i = 0; i < charArray.length; i++)
        byteArray[i] = (byte) charArray[i];
        byte[] md5Bytes = md5.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16)
            hexValue.append("0");
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }
    
    // 可逆的加密算法   
    public static String en_al(String inStr) {
        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++) {
            a[i] = (char) (a[i] ^ 't');
        }
        String s = new String(a);
        return s;
    }
    
    // 加密后解密   
    public static String JM(String inStr) {
        char[] a = inStr.toCharArray();
        for (int i = 0; i < a.length; i++) {
            a[i] = (char) (a[i] ^ 't');
        }
        String k = new String(a);
        return k;
    }
    
    public static void main(String[] args) {
        String s = new String("123456"); 
        System.out.println("原始:" + s); 
        System.out.println("MD5后:" + str_toMD5(s)); 
        System.out.println("MD5后再加密:" + en_al(str_toMD5(s))); 
        System.out.println("解密为MD5后的:" + JM(en_al(str_toMD5(s))));
    }
    }

     借鉴于https://blog.csdn.net/love_moon821/article/details/79843845

  • 相关阅读:
    Thinhole类声明和实现
    Pinhole类声明和实现
    Camera类定义和实现
    同心映射定义和测试
    Hammersley采样类定义和测试
    NRooks采样类定义和测试
    MultiJittered采样类定义和测试
    Jittered采样类定义和测试
    git分支操作
    Git单人本地仓库操作
  • 原文地址:https://www.cnblogs.com/123456www/p/12372916.html
Copyright © 2011-2022 走看看