在java中创建受密码保护的文件

时间:2012-08-11 11:59:22

标签: java file passwords protected

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

有一种简单的方法吗?

再一次,我的目标不是创建一个文件然后添加密码,而是在创建期间通过密码保护文件。 实际上,我希望当前的跑步者计划在阅读/编辑创建的文件时没有访问权限,除非他/她之前设置了密码。

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

度过美好的一天!

3 个答案:

答案 0 :(得分: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);

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

答案 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);

希望这有帮助。

答案 2 :(得分:1)

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

您可以使用@mazaneicha的评论来帮助您开始朝这个方向发展。如果您想深入了解它,可以查看Java Cryptography architectrejavax.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;
    }
}