互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 互联网并发与安全系列教程(12) - 信息加密技术(单向散列加密)

1. 简介

散列是信息的提炼,通常其长度要比信息小得多,且为一个固定长度。加密性强的散列一定是不可逆的,这就意味着通过散列结果,无法推出任何部分的原始信息。任何输入信息的变化,哪怕仅一位,都将导致散列结果的明显变化,这称之为“雪崩效应”。散列还应该是防冲突的,即找不出具有相同散列结果的两条信息。具有这些特性的散列结果就可以用于验证信息是否被修改。

单向散列函数一般用于产生消息摘要,密钥加密等,常见的有:

  • MD5(Message Digest Algorithm 5) :是RSA数据安全公司开发的一种单向散列算法,非可逆,相同的明文产生相同的密文。
  • SHA(Secure Hash Algorithm):可以对任意长度的数据运算生成一个160位的数值;

SHA-1与MD5的比较:

因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

  1. 对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2128数量级的操作,而对SHA-1则是2160数量级的操作。这样,SHA-1对强行攻击有更大的强度。
  2. 对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。
  3. 速度:在相同的硬件上,SHA-1的运行速度比MD5慢。

About单项散列加密:

  • 特征:雪崩效应、定长输出和不可逆。
  • 作用:确保数据的完整性。
  • 加密算法:md5(标准密钥长度128位)、sha1(标准密钥长度160位)、md4、CRC-32。
  • 加密工具:md5sum、sha1sum、openssl dgst。
  • 计算某个文件的hash值,例如:md5sum/shalsum FileName,openssl dgst –md5/-sha

2. MD5加密

可以在线MD5加密:http://www.cmd5.com/

使用Java可以进行MD5加密,一般采用MD5加盐的方式:

一般使用的加盐:

MD5 (Password+UserName),即将用户名和密码字符串相加再MD5,这样的MD5摘要基本上不可反查。有时候用户名可能会发生变化,发生变化后密码即不可用了(验证密码实际上就是再次计算摘要的过程)。

因此我们做了一个非常简单的加盐算法,每次保存密码到数据库时,都生成一个随机16位数字,将这16位数字和密码相加再求MD5摘要,然后在摘要中再将这16位数字按规则掺入形成一个48位的字符串。

在验证密码时再从48位字符串中按规则提取16位数字,和用户输入的密码相加再MD5。按照这种方法形成的结果肯定是不可直接反查的,且同一个密码每次保存时形成的摘要也都是不同的。

代码如下:

/**
 * MD5加盐加密
 */
public class PasswordUtil {
  /**
   * 生成含有随机盐的密码
   */
  public static String generate(String password) {
    Random r = new Random();
    StringBuilder sb = new StringBuilder(16);
    sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
    int len = sb.length();
    if (len < 16) {
      for (int i = 0; i < 16 - len; i++) {
        sb.append("0");
      }
    }
    String salt = sb.toString();
    password = md5Hex(password + salt);
    char[] cs = new char[48];
    for (int i = 0; i < 48; i += 3) {
      cs[i] = password.charAt(i / 3 * 2);
      char c = salt.charAt(i / 3);
      cs[i + 1] = c;
      cs[i + 2] = password.charAt(i / 3 * 2 + 1);
    }
    return new String(cs);
  }
  /**
   * 校验密码是否正确
   */
  public static boolean verify(String password, String md5) {
    char[] cs1 = new char[32];
    char[] cs2 = new char[16];
    for (int i = 0; i < 48; i += 3) {
      cs1[i / 3 * 2] = md5.charAt(i);
      cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
      cs2[i / 3] = md5.charAt(i + 1);
    }
    String salt = new String(cs2);
    return md5Hex(password + salt).equals(new String(cs1));
  }
  /**
   * 获取十六进制字符串形式的MD5摘要
   */
  public static String md5Hex(String src) {
    try {
      MessageDigest md5 = MessageDigest.getInstance("MD5");
      byte[] bs = md5.digest(src.getBytes());
      return new String(new Hex().encode(bs));
    } catch (Exception e) {
      return null;
    }
  }
  public static void main(String[] args) {
    // 加密+加盐
    String password1 = generate("admin");
    System.out.println("结果:" + password1 + "   长度:" + password1.length());
    // 解码
    System.out.println(verify("admin", password1));
    // 加密+加盐
    String password2 = generate("admin");
    System.out.println("结果:" + password2 + "   长度:" + password2.length());
    // 解码
    System.out.println(verify("admin", password2));
  }
}


目录
相关文章
|
6天前
|
存储 安全 数据安全/隐私保护
安全升级!Python AES加密实战,为你的代码加上一层神秘保护罩
【9月更文挑战第12天】在软件开发中,数据安全至关重要。本文将深入探讨如何使用Python中的AES加密技术保护代码免受非法访问和篡改。AES(高级加密标准)因其高效性和灵活性,已成为全球最广泛使用的对称加密算法之一。通过实战演练,我们将展示如何利用pycryptodome库实现AES加密,包括生成密钥、初始化向量(IV)、加密和解密文本数据等步骤。此外,还将介绍密钥管理和IV随机性等安全注意事项。通过本文的学习,你将掌握使用AES加密保护敏感数据的方法,为代码增添坚实的安全屏障。
22 8
|
8天前
|
存储 安全 算法
RSA在手,安全我有!Python加密解密技术,让你的数据密码坚不可摧
【9月更文挑战第11天】在数字化时代,信息安全至关重要。传统的加密方法已难以应对日益复杂的网络攻击。RSA加密算法凭借其强大的安全性和广泛的应用场景,成为保护敏感数据的首选。本文介绍RSA的基本原理及在Python中的实现方法,并探讨其优势与挑战。通过使用PyCryptodome库,我们展示了RSA加密解密的完整流程,帮助读者理解如何利用RSA为数据提供安全保障。
22 5
|
12天前
|
存储 安全 算法
显微镜下的安全战!Python加密解密技术,透视数字世界的每一个安全细节
【9月更文挑战第7天】在数字世界中,数据安全至关重要。Python加密解密技术如同显微镜下的精密工具,确保信息的私密性和完整性。以大型医疗机构为例,通过AES和RSA算法的结合,既能高效加密大量医疗数据,又能安全传输密钥,防止数据泄露。以下是使用Python的`pycryptodome`库实现AES加密和RSA密钥交换的简化示例。此方案不仅提高了数据安全性,还为数字世界的每个细节提供了坚实保障,引领我们迈向更安全的未来。
20 1
|
18天前
|
安全 网络安全 数据安全/隐私保护
网络安全漏洞与加密技术:保护信息的艺术
【8月更文挑战第31天】在数字时代,网络安全和信息安全的重要性日益凸显。本文将探讨网络安全漏洞、加密技术以及提升安全意识等方面的内容。我们将通过实际代码示例和案例分析,深入了解网络攻击者如何利用安全漏洞进行攻击,以及如何运用加密技术来保护数据安全。同时,我们还将讨论如何提高个人和组织的安全意识,以应对不断变化的网络安全威胁。让我们一起探索这个充满挑战和机遇的领域吧!
|
28天前
|
安全 算法 Java
java系列之~~网络通信安全 非对称加密算法的介绍说明
这篇文章介绍了非对称加密算法,包括其定义、加密解密过程、数字签名功能,以及与对称加密算法的比较,并解释了非对称加密在网络安全中的应用,特别是在公钥基础设施和信任网络中的重要性。
|
18天前
|
安全 开发者 数据安全/隐私保护
Xamarin 的安全性考虑与最佳实践:从数据加密到网络防护,全面解析构建安全移动应用的六大核心技术要点与实战代码示例
【8月更文挑战第31天】Xamarin 的安全性考虑与最佳实践对于构建安全可靠的跨平台移动应用至关重要。本文探讨了 Xamarin 开发中的关键安全因素,如数据加密、网络通信安全、权限管理等,并提供了 AES 加密算法的代码示例。
30 0
|
18天前
|
SQL 安全 算法
网络安全漏洞与加密技术:保护信息的关键
【8月更文挑战第31天】在数字化时代,信息安全成为我们每个人都必须面对的问题。本文将探讨网络安全的漏洞、加密技术以及如何提高安全意识来保护我们的信息。我们将通过一些代码示例,更深入地理解这些概念。无论你是网络专家还是普通用户,这篇文章都将为你提供有价值的信息。让我们一起探索这个充满挑战和机遇的网络世界吧!
|
20天前
|
SQL 监控 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
【8月更文挑战第29天】在数字化时代,网络安全和信息安全成为了全球关注的焦点。本文将探讨网络安全漏洞、加密技术以及提升个人和企业的安全意识等方面的重要性。我们将通过实例分析,了解如何防范网络攻击,保护数据安全,并提高对网络安全威胁的认识。
|
25天前
|
安全 网络安全 数据安全/隐私保护
|
25天前
|
安全 网络安全 数据安全/隐私保护