java.security.MessageDigest的使用(1)!

简介:

我们知道,编程中数据的传输,保存,为了考虑安全性的问题,需要将数据进行加密.我们拿数据库做例子.如果一个用户注册系统的数据库,没有对用户的信息进行保存,如,我去页面注册,输入"Vicky","123456".注册.web服务器未对数据进行加密而直接写入数据库,那么数据库中的用户信息,便是一个直接可用的数据!一旦服务器服务器被黑~那么用户的信息将毫无保留的展现在黑客面前...为了解决这个弊端,现在大多数都会将信息进行MD5加密.如"Vicky"与"123456"加密后,会生成16位或者32位字符串.而黑客即便获得这些数据也无法使用...

    MD5是常用的加密方法,这里主要讲述JDK中的java.security.MessageDigest加密方式!

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {             
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            String usernameMD5 = messageDigest.digest().toString();  
            System.out.println(usernameMD5);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   String usernameMD5 = messageDigest.digest().toString();
   System.out.println(usernameMD5);
  } catch (Exception e) {
   e.printStackTrace();
  }
 } 打印的是:[B@107077e,这是因为输出的是byte[](messageDigest.digest()得到的是个二进制byte数组,有可能某些byte是不可打印的字符。)...我们可以使用Base64来处理byte[]

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {             
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            System.out.println(Base64.encode(messageDigest.digest()));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   System.out.println(Base64.encode(messageDigest.digest()));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

打印的是:AgwpBZPO+ErqxOosJp0ybQ== 

当然我们可以编写函数,处理二进制转hex字符串.

如:

view plaincopy to clipboardprint?
/** 
     * 将16位byte[] 转换为32位String 
     *  
     * @param buffer 
     * @return 
     */ 
    private String toHex(byte buffer[]) {  
        StringBuffer sb = new StringBuffer(buffer.length * 2);  
        for (int i = 0; i < buffer.length; i++) {  
            sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));  
            sb.append(Character.forDigit(buffer[i] & 15, 16));  
        }  
 
        return sb.toString();  
    } 
/**
  * 将16位byte[] 转换为32位String
  *
  * @param buffer
  * @return
  */
 private String toHex(byte buffer[]) {
  StringBuffer sb = new StringBuffer(buffer.length * 2);
  for (int i = 0; i < buffer.length; i++) {
   sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));
   sb.append(Character.forDigit(buffer[i] & 15, 16));
  }

  return sb.toString();
 }

编写测试语句

view plaincopy to clipboardprint?
@Test 
    public void testMD() {  
        try {  
              
            String username = "Vicky";  
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
            messageDigest.update(username.getBytes());  
            System.out.println(toHex(messageDigest.digest()));  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    } 
@Test
 public void testMD() {
  try {
   
   String username = "Vicky";
   MessageDigest messageDigest = MessageDigest.getInstance("MD5");
   messageDigest.update(username.getBytes());
   System.out.println(toHex(messageDigest.digest()));
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

打印:020c290593cef84aeac4ea2c269d326d,返回的是32位的字符串!!!

这样我们便可以直接使用JDK为我们提供的加密类与函数了!

MessageDigest不仅仅只为我们提供了"MD5"加密,还提供了"SHA-1"

创建的方法只为: MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");

MD5与SHA-1的区别为:MD5是16位,SHA是20位(这是两种报文摘要的算法)

难道 MessageDigest 只能用作数据加密吗?如何使用MessageDigest生成安全令牌!!!

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/eclipser1987/archive/2010/01/08/5158784.aspx

目录
相关文章
|
前端开发 JavaScript 监控
layui框架IE8下的兼容问题收录一
layui框架IE8下的兼容问题收录一
2051 0
|
JavaScript 前端开发
JS之url进行编码和解码(三种方式)
JS之url进行编码和解码(三种方式)
19865 2
|
8月前
|
数据采集 人工智能 监控
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
Crawl4AI 是2025年GitHub上备受瞩目的开源网络爬虫工具,专为AI时代设计。它不仅能抓取网页内容,还能理解页面语义结构,生成适配大语言模型的训练数据格式。上线半年获4万+星标,应用于1200+AI项目。其功能亮点包括智能内容提取引擎、AI就绪数据管道和企业级特性,支持动态页面处理、多语言识别及分布式部署。技术架构基于Python 3.10与Scrapy框架,性能卓越,适用于AI训练数据采集、行业情报监控等场景。相比Scrapy、BeautifulSoup等传统工具,Crawl4AI在动态页面支持、PDF解析和语义分块方面更具优势
2810 0
40.8K star!让AI帮你读懂整个互联网:Crawl4AI开源爬虫工具深度解析
|
机器学习/深度学习 算法 前端开发
集成学习的力量:Sklearn中的随机森林与梯度提升详解
【7月更文第23天】集成学习,作为机器学习中一种强大而灵活的技术,通过结合多个基础模型的预测来提高整体预测性能。在`scikit-learn`(简称sklearn)这一Python机器学习库中,随机森林(Random Forest)和梯度提升(Gradient Boosting)是两种非常流行的集成学习方法。本文将深入解析这两种方法的工作原理,并通过代码示例展示它们在sklearn中的应用。
631 10
|
SQL 存储 关系型数据库
(一)全解MySQL之架构篇:自顶向下深入剖析MySQL整体架构!
无论你是前端还是后端,只要是一个合格的开发者,对于MySQL这个名词相信都不陌生,MySQL逐渐成为了最受欢迎的关系型数据库,无论你是大前端,亦或是Java、Go、Python、C/C++、PHP....等这些语言的程序员,对于MySQL是必然要掌握的核心技术之一,程序员不能没有MySQL,就像西方不能失去耶路撒冷一般。
2345 2
|
JavaScript Ubuntu jenkins
Jenkins详细安装配置部署
Jenkins是一款流行的开源持续集成/持续交付(CI/CD)工具,可以实现自动化构建、测试和部署软件。下面是Jenkins的详细安装、配置和部署过程。
1290 0
|
存储 缓存 前端开发
如何优化 SSR 应用以减少服务器压力?
如何优化 SSR 应用以减少服务器压力?
|
SQL 关系型数据库 MySQL
Vanna使用ollama分析本地数据库
这篇文章详细介绍了如何使用Vanna和Ollama框架来分析本地数据库,实现自然语言查询转换为SQL语句并与数据库交互的过程。
2588 7
Vanna使用ollama分析本地数据库
|
JavaScript
cnpm 的安装与使用
本文介绍了npm和cnpm的概念、安装nodejs的步骤,以及cnpm的安装和使用方法,提供了通过配置npm使用中国镜像源来加速包下载的替代方案,并说明了如何恢复npm默认仓库地址。
cnpm 的安装与使用
|
算法 安全 数据安全/隐私保护
Android经典实战之常见的移动端加密算法和用kotlin进行AES-256加密和解密
本文介绍了移动端开发中常用的数据加密算法,包括对称加密(如 AES 和 DES)、非对称加密(如 RSA)、散列算法(如 SHA-256 和 MD5)及消息认证码(如 HMAC)。重点讲解了如何使用 Kotlin 实现 AES-256 的加密和解密,并提供了详细的代码示例。通过生成密钥、加密和解密数据等步骤,展示了如何在 Kotlin 项目中实现数据的安全加密。
788 1