栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

基于Java 256位AES密码的加密

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于Java 256位AES密码的加密

与带外接收者共享

password(a char[])
salt
a
byte[]
选择的
-8个
字节,这
SecureRandom
是个好习惯,不需要保密)。然后从此信息中得出一个好的密钥:

SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256");KeySpec spec = new PBEKeySpec(password, salt, 65536, 256);SecretKey tmp = factory.generateSecret(spec);SecretKey secret = new SecretKeySpec(tmp.getEnpred(), "AES");

幻数(可以在某处定义为常数)65536和256分别是密钥派生迭代计数和密钥大小。

迭代密钥派生功能需要大量的计算工作,并且可以防止攻击者快速尝试许多不同的密码。可以根据可用的计算资源来更改迭代次数。

密钥大小可以减小到128位,这仍然被认为是“强”加密,但是如果发现攻击削弱了AES,它的安全边际就不会太大。

与适当的块链接模式一起使用时,相同的派生密钥可用于加密许多消息。在密码块链接(CBC)中,为每个消息生成一个随机初始化向量(IV),即使明文相同,也会产生不同的密文。CBC可能不是你可用的最安全的模式(请参阅下面的AEAD);还有许多其他模式具有不同的安全性属性,但是它们都使用类似的随机输入。无论如何,每个加密操作的输出都是密文和初始化向量:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, secret);AlgorithmParameters params = cipher.getParameters();byte[] iv = params.getParameterSpec(IvParameterSpec.class).getIV();byte[] ciphertext = cipher.doFinal("Hello, World!".getBytes("UTF-8"));

存储

ciphertext
iv
。解密时,
SecretKey
使用具有相同盐和迭代参数的密码以完全相同的方式重新生成。使用此密钥初始化密码,并使用消息存储初始化向量:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));String plaintext = new String(cipher.doFinal(ciphertext), "UTF-8");System.out.println(plaintext);

Java 7包括对AEAD密码模式的 API 支持,OpenJDK和Oracle发行版中包括的“ SunJCE”提供程序从Java 8开始实现这些功能。强烈建议使用其中一种模式来代替CBC。它将保护数据的完整性及其隐私。

java.security.InvalidKeyException
与消息“非法密钥大小或默认参数”指的是加密强度是有限的; 无限强度管辖权策略文件不在正确的位置。在JDK中,应将它们放置在
${jdk}/jre/lib/security

根据问题描述,听起来策略文件未正确安装。系统可以轻松拥有多个Java运行时。仔细检查以确保使用了正确的位置。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/375911.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号