小编典典

一种简单的方法是在Java中使用基于密码的加密。这使你可以使用密码来加密和解密文本。

这基本上意味着初始化一个javax.crypto.Cipherwith算法"AES/CBC/PKCS5Padding"并从javax.crypto.SecretKeyFactory该"PBKDF2WithHmacSHA512"算法获取密钥。

这是一个代码示例(已更新以替换不太安全的基于MD5的变体):

import java.io.IOException;

import java.io.UnsupportedEncodingException;

import java.security.AlgorithmParameters;

import java.security.GeneralSecurityException;

import java.security.NoSuchAlgorithmException;

import java.security.spec.InvalidKeySpecException;

import java.util.Base64;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.SecretKeyFactory;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.PBEKeySpec;

import javax.crypto.spec.SecretKeySpec;

public class ProtectedConfigFile {

public static void main(String[] args) throws Exception {

String password = System.getProperty("password");

if (password == null) {

throw new IllegalArgumentException("Run with -Dpassword=");

}

// The salt (probably) can be stored along with the encrypted data

byte[] salt = new String("12345678").getBytes();

// Decreasing this speeds down startup time and can be useful during testing, but it also makes it easier for brute force attackers

int iterationCount = 40000;

// Other values give me java.security.InvalidKeyException: Illegal key size or default parameters

int keyLength = 128;

SecretKeySpec key = createSecretKey(password.toCharArray(),

salt, iterationCount, keyLength);

String originalPassword = "secret";

System.out.println("Original password: " + originalPassword);

String encryptedPassword = encrypt(originalPassword, key);

System.out.println("Encrypted password: " + encryptedPassword);

String decryptedPassword = decrypt(encryptedPassword, key);

System.out.println("Decrypted password: " + decryptedPassword);

}

private static SecretKeySpec createSecretKey(char[] password, byte[] salt, int iterationCount, int keyLength) throws NoSuchAlgorithmException, InvalidKeySpecException {

SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512");

PBEKeySpec keySpec = new PBEKeySpec(password, salt, iterationCount, keyLength);

SecretKey keyTmp = keyFactory.generateSecret(keySpec);

return new SecretKeySpec(keyTmp.getEncoded(), "AES");

}

private static String encrypt(String property, SecretKeySpec key) throws GeneralSecurityException, UnsupportedEncodingException {

Cipher pbeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

pbeCipher.init(Cipher.ENCRYPT_MODE, key);

AlgorithmParameters parameters = pbeCipher.getParameters();

IvParameterSpec ivParameterSpec = parameters.getParameterSpec(IvParameterSpec.class);

byte[] cryptoText = pbeCipher.doFinal(property.getBytes("UTF-8"));

byte[] iv = ivParameterSpec.getIV();

return base64Encode(iv) + ":" + base64Encode(cryptoText);

}

private static String base64Encode(byte[] bytes) {

return Base64.getEncoder().encodeToString(bytes);

}

private static String decrypt(String string, SecretKeySpec key) throws GeneralSecurityException, IOException {

String iv = string.split(":")[0];

String property = string.split(":")[1];

Cipher pbeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

pbeCipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(base64Decode(iv)));

return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8");

}

private static byte[] base64Decode(String property) throws IOException {

return Base64.getDecoder().decode(property);

}

}

仍然存在一个问题:你应该在哪里存储用于加密密码的密码?你可以将其存储在源文件中并对其进行模糊处理,但是再次找到它并不难。另外,你可以在启动Java进程(-DpropertyProtectionPassword=...)时将其作为系统属性提供。

如果你使用同样受密码保护的KeyStore,则仍然存在相同的问题。基本上,你将需要在某个地方拥有一个主密码,而且很难保护。

2020-03-06

java 配置文件加密_Java在配置文件中加密密码?相关推荐

  1. php ios android 加密,在android/ios中加密,在php中解密

    我想解密我的网站上的一个字符串,该字符串在移动设备(Android或ios)上加密. 我有一个类似的输出,从这两个设备,它使用以下Android代码(sans例外保持简短).在android/ios中 ...

  2. php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

    本文实例讲述了php中加密解密DES类的简单使用方法.分享给大家供大家参考,具体如下: 在平时的开发工作中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,所以要正确使用DES加密解密 代 ...

  3. 移动硬盘里的linux系统文件夹加密,在Deepin系统中加密移动存储设备的方法

    本文介绍简单可行的方法让你在Deepin系统中加密你的移动存储设备,包括U盘及移动硬盘.同时要指出的是虽然可以采用下面方法保护数据不让他人随意观看,但是不能阻止他人破坏数据,例如,格式化U盘或移动硬盘 ...

  4. md5 php 加密后乱码_PHP中的密码加密的解决方案总结

    很多用户多个网站使用一个密码,当一个密码丢失其他也遭殃,本篇文章介绍了PHP中的密码加密的解决方案总结,有需要的朋友可以了解一下. 层出不穷的类似事件对用户会造成巨大的影响,因为人们往往习惯在不同网站 ...

  5. android 大文件加密,如何在android中加密大视频文件

    我有一个应用程序,我正在使用该代码来解密已加密的文件.文件位置是"/mnt/sdcard/myfolder/test.mp4". test.mp4文件大小约为20MB.如何在and ...

  6. java SE 费用_Java SE 6中的垃圾回收器G1收费是虚惊一场

    [51CTO快译]在Sun宣布Java SE 6 update 14版本中的垃圾回收器G1将收费之后,引起了Java社区相当大的反响.之后不久的6月5日,有一个细心的匿名读者发表了这样一个帖子: &q ...

  7. crytojs加密 java解密,使用CryptoJS在Javascript中加密并在Java中解密

    我试图使用谷歌的 https://code.google.com/p/crypto-js/#AES加密JavaScript,就像它的例子一样.问题是,我试图用Java解密它的结果是不同的.我可以看到的 ...

  8. java jar 配置文件路径_java jar 配置文件的相对路径问题

    无论是在Windows还是Linux操作系统下,绝对路径和相对路径都是很重要的概念,也是许多初学者迷惑的地方,下面我们就这两个概念进行介绍. 绝对路径:由根目录'/'开始写起的文件名或者目录名称,例如 ...

  9. java对时间使用des加密_Java如何使用DES加密对象?

    本示例演示使用DES算法加密对象.加密对象后,我们将其存储在文件中,该文件将在下一个示例中解密,该如何使用DES解密对象.package org.nhooo.example.crypto; impor ...

最新文章

  1. python鸡兔同笼编程输出不存在合理答案_Python 解答鸡兔同笼和五家共井问题
  2. json带斜杠java,带斜杠的json解析
  3. ITK:创建一个高斯分布
  4. Swift 和 Objective-C 混编
  5. 深度学习最佳实践系列——权重w初始化
  6. html input 字体颜色_html 元素参考整合实用收藏!前端web工程师必备!
  7. RS报表从按月图表追溯到按日报表
  8. 我的第一次随笔——胡桂玲
  9. 2020-12-27
  10. SQL Server数据库应用与开发教程各章习题参考答案
  11. 关于目标文件系统,文件过大的解决方法
  12. java开发常用软件下载地址及教程。
  13. srsLTE系统安装教程
  14. Android手机扫描识别银行卡技术
  15. Linux中top命令参数说明
  16. Au入门系列之一:认识 Audition
  17. 图片上添加自定义标记,可点击,可删除,可长按移动
  18. 各种说明方法的答题格式_说明方法的作用答题格式
  19. 全球最好听的50首英文歌
  20. Asp.net 团队同时发布 WebMatrix, Razor, MVC3 和Orchard [转]

热门文章

  1. 使用服务器备份还原Linux系统
  2. 1《小学数学教材解读策略研究》课题研究方案
  3. div点击穿透,CSS属性pointer-events :none;实现护眼模式, 夜间模式遮罩
  4. ubuntu 安装浏览器flash插件
  5. 小猿日记 - 程序猿的日常日记(4)
  6. 通俗讲解CDN是什么
  7. C++多线程--std::packaged_task
  8. 算法实践:数独的基本解法
  9. 算法集训队第二场考核赛_C.掌门人打桩
  10. 朱松纯:初探计算机视觉的三个源头_兼谈人工智能