抽象

这是涵盖Java加密算法的三部分博客系列的第1部分。 本系列介绍如何实现以下目标:

  1. 使用SHA–512散列
  2. 使用AES–256的单密钥对称加密
  3. 使用RSA–4096的公钥/私钥非对称加密

这第一篇文章详细介绍了如何实现SHA–512哈希。 让我们开始吧。

免责声明

这篇文章仅供参考。 在使用所提供的任何信息之前,请认真思考。 从中学到东西,但最终自己做出决定,风险自负。

要求

我使用以下主要技术完成了本文的所有工作。 您可能可以使用不同的技术或版本来做相同的事情,但不能保证。

  • Java 1.8.0_152_x64
  • NetBeans 8.2(内部版本201609300101)
  • Maven 3.0.5(与NetBeans捆绑在一起)

下载

访问我的GitHub页面以查看我所有的开源项目。 这篇文章的代码位于项目中: thoth-cryptography

散列

关于

散列是一种单向密码算法,它接收任意长度的消息,并输出该消息的可重复,固定长度和单向摘要(哈希)。 作为单向方式,应该无法从哈希值中重新生成原始消息。 相同的消息将始终生成相同的哈希。

哈希可以用于验证原始消息。 哈希的一种常见用法是验证密码。 而不是存储密码本身,而是存储密码的哈希。 为了验证密码,在登录过程中将存储的哈希与输入密码的新哈希进行比较。

由于相同的消息会生成相同的哈希,因此将使用salt值使哈希更安全(Salt,2017,第1段)。 考虑多个用户使用相同密码的情况。 盐值与原始密码结合使用可实现唯一的哈希值。 这很重要,因为如果散列值曾经遭到破坏,则相同的哈希值会让黑客知道那些密码是相同的。

SHA–512

截至今天进行的研究似乎表明,哈希算法的最佳和最安全算法是SHA–512,它使用64位字(Secure Hash Algorithms,2017,第2段)。 让我们看一个例子。

注意请勿将MD5用作安全哈希。 它具有许多漏洞(MD5,2017年,第1段)。 将MD5的使用限制为校验和和数据验证。

清单1是ShaTest.java单元测试,演示了如何哈希。 清单2是执行哈希的Sha.java类。

清单1 – ShaTest.java类

package org.thoth.security.hash;import java.util.Optional;
import org.junit.Assert;
import org.junit.Test;/*** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class ShaTest {@Testpublic void test_hash_with_optional_to_hex() throws Exception {// setupString username = "mjremijan";String password = "super!secret";Sha sha = new Sha();// testString asHex= sha.hashToHex(password, Optional.of(username));// assertAssert.assertEquals("F38CD5290D11B20159E36740843A8D93CFDFA395CF594F328613EF5C7BA42D9EAC00BF3EE47B7E8CE1587040B36365F05C8E15E9392C288A1D7C4CFB66097848", asHex);}@Testpublic void test_hash_without_optional_to_hex() throws Exception {// setupString password = "super!secret";Sha sha = new Sha();// testString asHex= sha.hashToHex(password, Optional.empty());// assertAssert.assertEquals("516A1FE9D87FE5B953D91B48B1A2FFA5AE5F670914C1B6FE0835D8877918DC4E8BC8FB8CCD520DBA940C21B4F294DFD1B4EFF2E06AB110C6A06E35068251C1DD", asHex);}@Testpublic void test_hash_with_optional_to_base64() throws Exception {// setupString username = "mjremijan";String password = "super!secret";Sha sha = new Sha();// testString asBase64= sha.hashToBase64(password, Optional.of(username));// assertAssert.assertEquals("84ZVKQ0RSGFZ42DAHDQNK8/FO5XPWU8YHHPVXHUKLZ6SAL8+5HT+JOFYCECZY2XWXI4V6TKSKIODFEZ7ZGL4SA==", asBase64);}@Testpublic void test_hash_without_optional_to_base64() throws Exception {// setupString password = "super!secret";Sha sha = new Sha();// testString asBase64= sha.hashToBase64(password, Optional.empty());// assertAssert.assertEquals("UWOF6DH/5BLT2RTISAL/PA5FZWKUWBB+CDXYH3KY3E6LYPUMZVINUPQMIBTYLN/RTO/Y4GQXEMAGBJUGGLHB3Q==", asBase64);}
}

清单2 – Sha.java类

package org.thoth.security.hash;import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
import java.util.Optional;/*** @author Michael Remijan mjremijan@yahoo.com @mjremijan*/
public class Sha {public String hashToHex(String hashMe, Optional<String> salt)throws NoSuchAlgorithmException, UnsupportedEncodingException {byte[] bytes= hash(hashMe, salt);StringBuilder sp= new StringBuilder();for (int i = 0; i < bytes.length; i++) {sp.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));}return sp.toString().toUpperCase();}public String hashToBase64(String hashMe, Optional<String> salt)throws NoSuchAlgorithmException, UnsupportedEncodingException {return Base64.getEncoder().encodeToString(hash(hashMe, salt)).toUpperCase();}public byte[] hash(String hashMe, Optional<String> salt)throws NoSuchAlgorithmException, UnsupportedEncodingException {MessageDigest md= MessageDigest.getInstance("SHA-512");md.update(hashMe.getBytes("UTF-8"));salt.ifPresent(s -> {try { md.update(s.getBytes("UTF-8")); } catch (Exception e) {throw new RuntimeException(e);}});return md.digest();}
}

摘要

哈希很容易。 选择一种强大的哈希算法(例如SHA–512)来保护您的应用程序数据。 避免使用MD5来保护数据。 及时了解哪些算法强大且安全。 如果您使用的是较旧的算法存在漏洞或受到威胁,请更新您的应用程序。

参考文献

盐(加密)。 (2017年11月3日)。 维基百科。 取自https://en.wikipedia.org/wiki/Salt_(cryptography) 。

安全哈希算法。 (2017年11月25日)。 维基百科。 取自https://en.wikipedia.org/wiki/Secure_Hash_Algorithms 。

MD5。 (2017年11月22日)。 维基百科。 取自https://en.wikipedia.org/wiki/MD5 。

翻译自: https://www.javacodegeeks.com/2017/12/choosing-java-cryptographic-algorithms-part-1-hashing.html

选择Java密码算法第1部分-散列相关推荐

  1. java 哈希算法_选择Java密码算法第1部分-哈希

    java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...

  2. 密码学(一)—— 背景、常用的密码算法简介,单向散列简介、数字签名简介

    背景 密码,最初的目的就是用于对信息的加密,计算机领域的密码技术种类繁多,但随着密码学的运用,密码还用于身份认证,防止否认等功能上.最基本的,是信息加密解密分为对称加密和非对称加密,这两者的区别在于是 ...

  3. 散列算法,Remal使用散列算法

    一.散列算法 散列算法让其保证不可逆,安全.这里举一个例子sh1的摘要算法.上代码 /*** 散列算法* @author Administrator*/ public class HashRsaUti ...

  4. 【计算机网络】网络安全 : 报文鉴别 ( 密码散列函数 | 报文摘要算法 MD5 | 安全散列算法 SHA-1 | MAC 报文鉴别码 )

    文章目录 一.报文鉴别 二.鉴别分类 三.报文鉴别 四.密码散列函数 五.MD5 算法 六.SHA-1 安全散列算法 七.MAC 报文鉴别码 一.报文鉴别 计算机网络安全措施 : ① 针对被动攻击 ( ...

  5. 数据结构与算法(七)—— 散列表结构及其实现和应用

    注:本篇内容参考了<Java常用算法手册>.<大话数据结构>和<算法导论(第三版)>三本书籍.并参考了百度百科. 本人水平有限,文中如有错误或其它不妥之处,欢迎大家 ...

  6. Java密码库Password4j

    Password4j 是一个 Java用户友好的密码库,用于使用不同的密钥派生函数(KDF) 和密码哈希函数(CHF) 对密码进行散列和检查. 可以通过编程方式或通过类路径中的属性文件配置算法,请参阅 ...

  7. 安全系列之——主流Hash散列算法介绍和使用

    其他文章: 安全系列之--手写JAVA加密.解密 安全系列之--数据传输的完整性.私密性.源认证.不可否认性 安全系列之--主流Hash散列算法介绍和使用 安全系列之--RSA的公钥私钥有多少人能分的 ...

  8. java 散列集_java数据结构之散列集HashSet与散列表Hashtable

    java数据结构之散列集HashSet与散列表Hashtable 1.散列集HashSet HashSet类在java.util包中 A.构造方法:HashSet() B.常用方法 public bo ...

  9. Java 密码学算法

    Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...

最新文章

  1. winform实现翻书效果_虚拟翻书系统解决方案
  2. 车辆颜色识别学习笔记
  3. mysql replace into用法详细说明
  4. Linux Shell常用技巧(九) 系统运行进程
  5. 有虚拟服务器的无线路由,无线路由,虚拟服务器,。怎么办?
  6. Python类的自定义属性访问及动态属性设置
  7. 自动化测试和手工测试
  8. Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
  9. 计算机数码频道策划方案,艺人策划方案电脑基础知识IT计算机专业资料-艺人策划方案.pdf...
  10. 【图说】Eclipse与Unity 3D协同工作
  11. iOS App被拒原因以及解决方案总结。
  12. 完整仿写鸿洋WanAndroid网站客户端
  13. 一种基于语音识别的机器人语义识别系统的制作方法
  14. 学习周刊-2021年第19周
  15. 14-基于51单片机的声音分贝测量与显示仿真
  16. vue 使用 createjs 绘制扇形
  17. Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.3.0.RELEAS错误解决
  18. 让qt应用程序拥有管理员权限
  19. flume1.8 TailDirSource断点续传与文件更名后数据重复采集的bug修复
  20. 移植tslib,测试电容屏

热门文章

  1. Java 证书pem转KeyStore、jks文件
  2. JS中typeof的用法
  3. 汇编语言(二十五)之成绩分段统计
  4. Java自动化邮件中发送图表(三)之Highchart
  5. 面试必考的网络协议相关题目应该如何回答
  6. python打包exe文件
  7. SpringBootAdmin服务端
  8. jquery sleep函数
  9. android 按键消息,在android中模拟键盘消息(shell命令的方法)
  10. 圆心角 圆弧上点坐标_数控加工中心CNC的G02/G03圆弧指令的I、J、与R的区别