![](/img/trans.png)
[英]Create password protected zip file in Java without creating it on disk
[英]Create a file protected by a password in java
我想在JAVA中创建一个受密码保护的文件。 我的意思是,一旦启动程序,由程序创建的一个文件将直接受到先前确定的密码的保护。
有简单的方法吗?
再一次,我的目的不是创建文件然后添加密码,而是在创建期间通过密码保护文件。 实际上,如果他/她具有先前设置的密码,那么我希望当前的运行程序无权读取/编辑创建的文件。
因此,无论如何,如果你们中的某些人由于使用Java而在编写文件时知道一种保护文件的简便方法,我将不胜感激。
祝你今天愉快!
您想用密码加密文件(内容)。 这是一个非常有名的库: http : //www.jasypt.org/
从他们的网站:
..encrypting and decrypting a text...
BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);
您可以将加密的内容读/写到文件中。
当您要加密文件,字符串等时,有两种主要方法。 您应该先构建一个类或方法来将您的字符串/文件转换为字节数组。 构建另一个方法,将字节数组转换回字符串/文件。
您可以使用以下两种方法对文件进行加密:1-对称密钥-秘密单词(通常是很大的字符字符串或用户设置的密码)将对文件和密码进行加密,并且将使用相同的密码进行解密。 2-非对称密钥-您生成一对密钥。 一个称为公钥,另一个称为私钥。 公钥用于加密文件,私钥用于解密。 这将是更“专业”的方法。
如果您想要一种真正安全的方法,则应下载GnuPG。 GnuPG是管理非对称加密的可执行文件,您可以构建一个类与GnuPG配合使用,并让GnuPG管理您的加密/解密过程。
有一种不安全的方法对Java(对称密钥)是“本机”的,可以为您解决:
加密:
byte[] key = //... password converted to an array of bytes
byte[] dataToSend = ...
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k =
new SecretKeySpec(key, "AES");
c.init(Cipher.ENCRYPT_MODE, k);
byte[] encryptedData = c.doFinal(dataToSend);
解密:
byte[] key = //
byte[] encryptedData = //
Cipher c = Cipher.getInstance("AES");
SecretKeySpec k =
new SecretKeySpec(key, "AES");
c.init(Cipher.DECRYPT_MODE, k);
byte[] data = c.doFinal(encryptedData);
希望这可以帮助。
如果文件是纯文本文件,则在程序中没有密码的情况下不授予用户访问权限并不能真正用密码保护数据,因为用户可以使用其他程序打开文件。 因此,如果文件是文本文件,那么我认为您必须使用加密。
您可以使用@mazaneicha的评论来帮助您朝着这个方向开始。 如果您想进一步研究它,可以查看Java Cryptography architectre和javax.crypto java docs 。
如果您的文件不是人类可读的,并且只有您的程序可以理解,那么我将文件的第一行或前n个字节设置为密码。 如果愿意,可以将另一个密码文件保存在同一目录中,并在确定用户是否有权查看该文件之前使用该密码对用户进行身份验证。 加密密码的常用方法是使用MD5哈希函数。 用户输入密码,您计算密码的哈希值,然后将计算出的哈希值与从文件读取的哈希值进行比较:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Use to encrypt passwords using MD5 algorithm
* @param password should be a plain text password.
* @return a hex String that results from encrypting the given password.
*/
static String encryptPassword(String password) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(password.getBytes());
byte byteData[] = md.digest();
StringBuilder hexString = new StringBuilder();
for (int i=0;i<byteData.length;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1)
hexString.append('0');
hexString.append(hex);
}
return hexString.toString();
}
catch(java.security.NoSuchAlgorithmException missing) {
return password;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.