选择Java密码算法第1部分-散列
抽象
这是涵盖Java加密算法的三部分博客系列的第1部分。 本系列介绍如何实现以下目标:
- 使用SHA–512散列
- 使用AES–256的单密钥对称加密
- 使用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部分-散列相关推荐
- java 哈希算法_选择Java密码算法第1部分-哈希
java 哈希算法 抽象 这是涵盖Java加密算法的三部分博客系列文章的第1部分. 该系列涵盖如何实现以下功能: 使用SHA–512散列 使用AES–256的单密钥对称加密 使用RSA–4096的公钥 ...
- 密码学(一)—— 背景、常用的密码算法简介,单向散列简介、数字签名简介
背景 密码,最初的目的就是用于对信息的加密,计算机领域的密码技术种类繁多,但随着密码学的运用,密码还用于身份认证,防止否认等功能上.最基本的,是信息加密解密分为对称加密和非对称加密,这两者的区别在于是 ...
- 散列算法,Remal使用散列算法
一.散列算法 散列算法让其保证不可逆,安全.这里举一个例子sh1的摘要算法.上代码 /*** 散列算法* @author Administrator*/ public class HashRsaUti ...
- 【计算机网络】网络安全 : 报文鉴别 ( 密码散列函数 | 报文摘要算法 MD5 | 安全散列算法 SHA-1 | MAC 报文鉴别码 )
文章目录 一.报文鉴别 二.鉴别分类 三.报文鉴别 四.密码散列函数 五.MD5 算法 六.SHA-1 安全散列算法 七.MAC 报文鉴别码 一.报文鉴别 计算机网络安全措施 : ① 针对被动攻击 ( ...
- 数据结构与算法(七)—— 散列表结构及其实现和应用
注:本篇内容参考了<Java常用算法手册>.<大话数据结构>和<算法导论(第三版)>三本书籍.并参考了百度百科. 本人水平有限,文中如有错误或其它不妥之处,欢迎大家 ...
- Java密码库Password4j
Password4j 是一个 Java用户友好的密码库,用于使用不同的密钥派生函数(KDF) 和密码哈希函数(CHF) 对密码进行散列和检查. 可以通过编程方式或通过类路径中的属性文件配置算法,请参阅 ...
- 安全系列之——主流Hash散列算法介绍和使用
其他文章: 安全系列之--手写JAVA加密.解密 安全系列之--数据传输的完整性.私密性.源认证.不可否认性 安全系列之--主流Hash散列算法介绍和使用 安全系列之--RSA的公钥私钥有多少人能分的 ...
- java 散列集_java数据结构之散列集HashSet与散列表Hashtable
java数据结构之散列集HashSet与散列表Hashtable 1.散列集HashSet HashSet类在java.util包中 A.构造方法:HashSet() B.常用方法 public bo ...
- Java 密码学算法
Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...
最新文章
- winform实现翻书效果_虚拟翻书系统解决方案
- 车辆颜色识别学习笔记
- mysql replace into用法详细说明
- Linux Shell常用技巧(九) 系统运行进程
- 有虚拟服务器的无线路由,无线路由,虚拟服务器,。怎么办?
- Python类的自定义属性访问及动态属性设置
- 自动化测试和手工测试
- Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
- 计算机数码频道策划方案,艺人策划方案电脑基础知识IT计算机专业资料-艺人策划方案.pdf...
- 【图说】Eclipse与Unity 3D协同工作
- iOS App被拒原因以及解决方案总结。
- 完整仿写鸿洋WanAndroid网站客户端
- 一种基于语音识别的机器人语义识别系统的制作方法
- 学习周刊-2021年第19周
- 14-基于51单片机的声音分贝测量与显示仿真
- vue 使用 createjs 绘制扇形
- Could not transfer artifact org.springframework.boot:spring-boot-starter-parent:pom:2.3.0.RELEAS错误解决
- 让qt应用程序拥有管理员权限
- flume1.8 TailDirSource断点续传与文件更名后数据重复采集的bug修复
- 移植tslib,测试电容屏