5

我想在 JAVA 中创建一个受密码保护的文件。我的意思是,一旦我启动程序,我的程序创建的一个文件将直接受到先前确定的密码的保护。

有简单的方法吗?

再一次,我的目标不是创建一个文件然后为其添加密码,而是在创建过程中通过密码保护文件。 实际上,如果他/她之前设置了密码,我希望当前的运行程序无法读取/编辑创建的文件。

所以无论如何,如果你们中的一些人知道在编写文件时使用 java 保护文件的简单方法,我将不胜感激。

祝你今天过得愉快!

4

3 回答 3

3

你想用密码加密你的文件(的内容)。这是一个非常知名的图书馆: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);

您可以将加密内容读/写到您的文件中。

于 2012-08-11T12:31:52.640 回答
1

当您想加密文件、字符串等时,有两种主要方法。您应该首先构建一个类或方法来将您的字符串/文件转换为字节数组。构建另一种方法将字节数组转换回字符串/文件。

您可以使用 2 种方法加密文件: 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);

希望这可以帮助。

于 2012-08-11T12:37:18.163 回答
1

如果文件是纯文本文件,那么在您的程序中不让用户在没有密码的情况下访问文件并不能真正对数据进行密码保护,因为用户可以使用其他程序打开文件。所以如果文件是文本文件,那么我认为你必须使用加密。

您可以使用@mazaneicha 的评论来帮助您开始朝这个方向发展。如果您想深入了解它,可以查看Java Cryptography architecturerejavax.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;
    }
}
于 2012-08-11T12:39:09.457 回答