0

パスワードの暗号化と復号化に AES を使用しています。私が実装しようとしているのは、クライアント側で暗号化されたパスワードを Cookie の形式で保存する必要があり、クライアントが Web サイトに再度ログインするときに、その暗号化されたパスワードをクライアント側から取得して復号化する必要があることです。クライアントから提供された暗号化されていないパスワードと照合します。私が直面している問題は、暗号化中に暗号化されたパスワードのバイト配列を Java で BASE64.encodeString() を使用して文字列に変換し、クライアント側に渡すことができるようにすることです。しかし、クライアント側から、つまり Cookie から同じ文字列を取得して復号化しようとすると、パディング エラーが発生します。

なぜそれが起こっているのですか?

暗号化のコード:

  Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivspec);
            byte[] plainBytes = Data.getBytes(UNICODE_FORMAT);
            byte[] encrypted = cipher.doFinal(plainBytes);
            String encryption = Base64.encodeBase64String(encrypted);
            return encryption;

復号化のためのコード:

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec);
        byte[] decryptval = Base64.decodeBase64(encryptedData);
        byte[] decrypted = cipher.doFinal(decryptval);
        return new String(decrypted);

暗号化された文字列をjsに渡してCookieに保存しているため、エラーが発生していますか?? JS は base64 でエンコードされた文字列をいじりますか?

4

2 に答える 2

1

パスワードの保存/送信に暗号を使用しないことを強くお勧めします。

ハッシュ関数は、より安全なアイデアです。暗号とハッシュの違いは、暗号は可逆であるのに対し、ハッシュは一方向 (プレーンテキスト -> ハッシュテキスト) であることです。サーバー上にユーザーのパスワードを a) プレーンテキストまたは b) 暗号化して保存することは、セキュリティの観点から大きな問題です。

一方、ハッシュは元に戻すことができません。(少なくとも理論上は)

MessageDigest単純なハッシュは、クラスを使用して簡単に実行できます

ハッシュを取得するのは非常に簡単です。

Message Digest md = MessageDigest.getInstance("MD5");
md.digest(input.getBytes());

その後、クライアント側はプレーンテキストのパスワードをハッシュしてサーバーに送信できます。次に、サーバーはハッシュを比較して認証し、パスワードをあちこちに送信することなく、残りのセッションで使用できるセッション トークンをユーザーに返すことができます。

于 2013-03-28T06:50:41.107 に答える
0

次の方法を使用して、暗号化中にバイトを文字列に変換してみてください -

public static String bytesToString(byte[] bytes) {
    HexBinaryAdapter adapter = new HexBinaryAdapter();
    String s = adapter.marshal(bytes);
    return s;
}

だから代わりに -

String encryption = Base64.encodeBase64String(encrypted);

使用する

String encryption = bytesToString(encrypted);

同様に、復号化中にこのメソッドを使用します-

public static byte[] hexToBytes(String hexString) {
    HexBinaryAdapter adapter = new HexBinaryAdapter();
    byte[] bytes = adapter.unmarshal(hexString);
    return bytes;
}

あれは -

byte[] decryptval = hexToBytes(encryptedData);
于 2013-03-28T06:21:36.880 に答える