5

JAVAでパスワードで保護されたファイルを作成したいと考えています。つまり、プログラムを起動すると、プログラムによって作成された 1 つのファイルが、事前に決定されたパスワードによって直接保護されるということです。

それを行う簡単な方法はありますか?

繰り返しますが、私の目的は、ファイルを作成してからパスワードを追加することではなく、ファイルをパスワードで保護する作成中です。 実際には、現在のランナー プログラムが、以前にパスワードを設定している場合を除き、作成されたファイルの読み取り/編集にアクセスできないようにしたいと考えています。

とにかく、Java のおかげで、書き込み時にファイルを保護する簡単な方法を知っている人がいれば、私はとても感謝しています。

良い1日を!

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つの方法があります。文字列/ファイルをバイトの配列に変換するクラスまたはメソッドを構築することから始める必要があります。バイトの配列を文字列/ファイルに変換する別のメソッドを作成します。

次の2つの方法を使用してファイルを暗号化できます。1-対称鍵-秘密の単語(通常、文字の巨大な文字列またはユーザーが設定したパスワード)は、ファイルとパスワードを暗号化し、同じパスワードを使用して復号化します。2-非対称キー-キーのペアを生成します。1つは公開鍵と呼ばれ、もう1つは秘密鍵と呼ばれます。公開鍵はファイルの暗号化に使用され、秘密鍵は復号化に使用されます。これは、より「専門的な」アプローチになります。

本当に安全なアプローチが必要な場合は、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暗号化アーキテクトjavax.cryptojavaドキュメントを参照してください。

ファイルが人間が読める形式ではなく、プログラムだけが理解できる場合は、ファイルの最初の行または最初の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 に答える