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

java 哈希算法

抽象

这是涵盖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 哈希算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/334051.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

在 Linux 下打包命令 tar 和压缩命令 7z 的配合使用示例

文章目录一、压缩命令&#xff08;结合 tar 命令&#xff09;二、解压命令&#xff08;结合 tar 命令&#xff09;一、压缩命令&#xff08;结合 tar 命令&#xff09; tar cf – /home/test | 7z a -si test.tar.7z上面命令将 /home/test 文件夹压缩为 test.tar.7z 文件。实际…

上传书籍进度信息到服务器...,使用HttpWebRequest实现大文件上传资料.pdf

Twilight Software Development Studio © 2011使用HttpWebRequest 实现大文件上传Author:xuzhihongCreate Date:2011-06-03Descriptions: WinForm 程序使用HttpWebRequest 实现大文件上传Url: /blog/static/2673158720115991432899/概述&#xff1a;通常在WinForm 程序中都…

做一个公众号大概要多少钱_公众号流量主一个月可以赚多少钱?

我是小郁儿&#xff0c;点击上方“关注”&#xff0c;每天为你分享自媒体运营与个人精进干货。细心的读者会发现&#xff0c;阅读我文章的时候&#xff0c;最下面不再出现广告卡片了&#xff0c;因为我前几天已经把流量主功能关掉。起初是因为我在看自己发的视频时&#xff0c;…

Linux 命令之 7za -- 文件压缩命令

文章目录一、命令介绍二、7za 和 7z 的区别三、常用选项四、命令示例&#xff08;一&#xff09;压缩指定目录下的内容&#xff08;二&#xff09;解压缩指定的压缩包到指定的目录下一、命令介绍 7za 一种文件压缩命令&#xff0c;7z格式具有高压缩比率&#xff0c;它采用了多…

从Speedment 3.0.17或更高版本的事务轻松返回值

交易次数 在我以前的文章中&#xff0c;我写了关于如何使用Speedment轻松使用事务的方法&#xff0c;其中我们原子地更新了两个银行帐户。 众所周知&#xff0c;事务是一种将多个数据库操作组合到一个原子执行的单个操作中的方法。 但是事务不仅与更新数据库有关&#xff0c;而…

华为路由设置虚拟服务器命令,华为路由器配置ip命令

基本命令  en 进入特权模式conf 进入全局配置模式in s0 进入 serial 0 端口配置ip add xxx.xxx.xxx.xxx xxx.xxx.xxx.xxx 添加ip 地址和掩码&#xff0c;电信分配enca hdlc/ppp 捆绑链路协议 hdlc 或者  ip unn e0  exit 回到全局配置模式in e0 进入以太接口配置ip add x…

分布式锁的三种实现方式_分布式锁的多种实现方式

目前几乎很多大型网站及应用都是分布式部署的&#xff0c;分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区…

apache ignite_使用Apache Ignite优化Spark作业性能(第1部分)

apache ignite来看看他们是如何工作的&#xff01; 本文的某些部分摘自我的书《 Apache Ignite的高性能内存计算》 。 如果您对这篇文章感兴趣&#xff0c;请查看本书的其余部分&#xff0c;以获取更多有用的信息。 Apache Ignite提供了多种方法来提高Spark作业的性能&#xf…

Linux 命令之 unrar -- 解压 rar 格式的文件

文章目录一、命令介绍二、常用选项三、命令示例&#xff08;一&#xff09;按完整路径解压指定的压缩包到当前目录下&#xff08;二&#xff09;按完整路径且不覆盖已存在文件的方式解压指定的压缩档案到指定的目录下一、命令介绍 需要安装 rarlinux 才能使用该命令&#xff0…

微软家庭服务器,微软公布Windows Server 2012版本方案,不再提供家庭服务器版

微软官方网站今日公布Windows Server 2012将有四个版本&#xff0c;分别为Foundation、Essentials、Standard以及Datacenter。其中Foundation只供给原始设备制造商(OEM)&#xff1b;Essentials适合中小企业使用&#xff0c;最大用户数为25个&#xff1b;Standard与Datacenter版…

eclipse创建神经网络_使用Eclipse Deeplearning4j构建简单的神经网络

eclipse创建神经网络神经网络导论 深度学习包含深度神经网络和深度强化学习&#xff0c;它们是机器学习的子集&#xff0c;而机器学习本身就是人工智能的子集。 广义地说&#xff0c;深度神经网络执行机器感知&#xff0c;该机器感知从原始数据中提取重要特征&#xff0c;并对每…

Linux 命令之 rar -- 压缩/解压文件

文章目录一、命令介绍二、子命令三、常用选项四、命令示例&#xff08;一&#xff09;压缩指定文件或者更新压缩包内指定的文件&#xff08;二&#xff09;压缩指定目录下的内容&#xff08;不含目录本身&#xff09;&#xff08;三&#xff09;创建自解压文件&#xff08;四&a…

python 马赛克还原_卷积神经网络教你如何还原被马赛克的文本图像

对人类来说&#xff0c;将带有文字的图像锐化是很容易的。以图1为例。图1&#xff1a;被锐化的图像把图1恢复为图2也不是件很困难的事。图2&#xff1a;原图然而&#xff0c;我们是懒惰的&#xff0c;并且不想这样做&#xff0c;所以我们尝试用神经网络来自动实现图片的不模糊化…

angluar cdk_零分钟即可在容器开发套件(CDK)上实现云运营

angluar cdk尽管这很有趣&#xff0c;但是它实际上并不可行&#xff0c;并且很快就遇到了使用限制。前一段时间&#xff0c; 我逐步完成了在容器中安装称为CloudForms的云管理解决方案。 真正的解决方案是将这个示例放入Red Hat Demo Central集合中&#xff0c;并将其放在基于…

Linux 系统下载和安装 rarlinux

文章目录红帽系的 Linux下载已经编译好的软件包下载程序的源代码软件包Debian Linux安装过程常遇到的问题rarlinux 下载地址&#xff1a;http://www.rarlab.com/download.html rarlinux 相关命令使用说明&#xff0c;猛戳《Linux 系统下命令 unrar 的中文版使用说明》 红帽系的…

腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题

没想到这篇文章这么受欢迎&#xff0c;那就再分享一篇&#xff1a;苏克1900&#xff1a;腾讯高级数据分析师&#xff1a;十年分析之路的力荐书籍​zhuanlan.zhihu.com以下原文章&#xff1a;近期暑期实习和提前批招聘已经开始了&#xff0c;不论你是校招还是想社招&#xff0c;…

Linux 系统下命令 unrar 的英文版使用说明

查看中文版&#xff0c;猛戳《Linux 系统下命令 unrar 的中文版使用说明》 UNRAR 5.40 freeware Copyright (c) 1993-2016 Alexander RoshalUsage: unrar <command> -<switch 1> -<switch N> <archive> <files...> <listfiles...&g…

网络研讨室_免费网络研讨会:Java应用程序中的吞咽异常

网络研讨室1月30日参加我们的网络研讨会&#xff0c;以发现Java应用程序中的“隐藏”异常。 如果一棵树落在森林中&#xff0c;但是没有写到原木上&#xff0c;它会发出声音吗&#xff1f; 答案是肯定的。 这些类型的错误可能会对用户体验造成严重影响&#xff0c;而没有根本原…

java8默认内存收集器_使用正确的垃圾收集器将Java内存使用量降至最低

java8默认内存收集器大小对于软件至关重要。 很明显&#xff0c;与大的整体方法相比&#xff0c;在微服务体系结构中使用小片段具有更多优势。 最新的Java版本的Jigsaw有助于分解旧应用程序或从头开始构建新的云原生应用程序。 这种方法减少了磁盘空间&#xff0c;构建时间和启…

oc 协议 回调 静态成员_每日一问:c++类的成员函数,能作为线程的参数吗?

问&#xff1a;类的成员函数可以传入线程参数吗&#xff1f;回答&#xff1a;如果c语言的全局函数&#xff0c;可以。如果是类的静态成员函数&#xff0c;可以如果是类的普通成员函数&#xff0c;不可以为什么&#xff1f;《深入探索C对象模型》中提到成员函数时&#xff0c;当…