Персистентное устройство хранения данных использования зашифрованных данных .NET

как упоминал djbrown, ваше создание сеттера неверно, и я изменяю некоторую строку кода в классе InfoAdd. используйте его, тогда у вас не будет проблем)

import javax.swing.*;
import java.awt.BorderLayout;
import java.awt.event.*;
import java.util.*;
public class InfoAdd implements KeyListener {
    private JTextArea textar;
    private JTextArea textarea;
    private JPanel panel;
    ArrayList<StudentList> stdlist;
    public static void main(String[] args) {
        InfoAdd inadd = new InfoAdd();
        inadd.go();
    }
    public void go() {
        JFrame frame = new JFrame("InfoAdd");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        panel = new JPanel();
        JPanel btpanel = new JPanel();
        JButton button = new JButton("Click");
        textarea = new JTextArea(10, 15);
        textar = new JTextArea(10, 15);
        JScrollPane scrollpane = new JScrollPane(textarea);
        JScrollPane scrollpan = new JScrollPane(textar);
        textarea.addKeyListener(this);
        textarea.setLineWrap(true);
        textar.setLineWrap(true);
        scrollpane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollpane.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scrollpan.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollpan.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(scrollpane);
        panel.add(scrollpan);
        btpanel.add(button);
        frame.setSize(300, 300);
        frame.add(BorderLayout.WEST, panel);
        frame.add(BorderLayout.EAST, btpanel);
        frame.setVisible(true);
    }
    public void keyTyped(KeyEvent e) {    }
    public void keyPressed(KeyEvent e) {    }
    public void keyReleased(KeyEvent e) {
        String add = textarea.getText();
        String[] delimiter = add.split("\\s+");
        String[] enter = add.split("[\\r\\n]+");
        stdlist = new ArrayList<>();
        for (int i = 0; i <= add.length(); i++) {
        StudentList studentList = new StudentList();
        System.out.println(delimiter.length);
        switch (enter.length) {
                case 1:
                    setName(delimiter, studentList);
                    break;
                case 2:
                    setName(delimiter, studentList);
                    studentList.setDateofbirth(enter[1]);
                    break;
                default:
                    setName(delimiter, studentList);
                    studentList.setDateofbirth(enter[1]);
                    studentList.setYear(enter[2]);
                    break;
            }
            stdlist.add(studentList);
            textar.setEditable(false);
            textar.setText("Firstname: " + studentList.getFirstname() + "\nLastName: " + studentList.getLastname()+" \nDateOfBirth: "+studentList.getDateofbirth() + "\nYear: " + studentList.getYear());
        }
    }
    private void setName(String[] delimiter, StudentList studentList) {
        if (delimiter.length == 1) {
            studentList.setFirstname(delimiter[0]);
        } else if (delimiter.length == 2) {
            studentList.setFirstname(delimiter[0]);
            studentList.setLastname(delimiter[1]);
        }
    }
    class StudentList {
        private String firstname;
        private String lastname;
        private String year;
        private String dateofbirth;
        public String getFirstname() {
            return firstname;
        }
        public void setFirstname(String firstname) {
            this.firstname = firstname;
        }
        public String getLastname() {
            return lastname;
        }
        public void setLastname(String lastname) {
            this.lastname = lastname;
        }
        public String getYear() {
            return year;
        }
        public void setYear(String year) {
            this.year = year;
        }
        public String getDateofbirth() {
            return dateofbirth;
        }
        public void setDateofbirth(String dateofbirth) {
            this.dateofbirth = dateofbirth;
        }
    }
}
17
задан Sunny Milenov 30 September 2008 в 18:53
поделиться

2 ответа

API Защиты данных (DPAPI) делает точно, что Вы хотите. Это обеспечивает симметричное шифрование произвольных данных, с помощью учетных данных машины или (лучше) пользователя, как ключ шифрования. Вы не должны волноваться об управлении ключами; Windows заботится об этом для Вас. Если пользователь изменит свой пароль, то Windows повторно зашифрует данные с помощью нового пароля пользователя.

DPAPI выставляется в.NET с Системой. Безопасность. Криптография. Класс ProtectedData:

byte[] plaintextBytes = GetDataToProtect();
byte[] encodedBytes = ProtectedData.Protect(plaintextBytes, null, DataProtectionScope.CurrentUser);

второй параметр Защищать метода является дополнительным энтропийным массивом байтов, который может использоваться в качестве дополнительного специализированного "секрета".

Для дешифрования используйте ProtectedData. Оставьте вызов без защиты:

byte[] encodedBytes = GetDataToUnprotect();
byte[] plaintextBytes = ProtectedData.Unprotect(encodedBytes, null, DataProtectionScope.CurrentUser);

DPAPI работает правильно с профилями роуминга (как описано здесь ), хотя необходимо будет сохранить зашифрованные данные в месте (сетевой ресурс, IsolatedStorage с IsolatedStorageScope. Роуминг , и т.д.), к которому могут получить доступ различные машины.

Посмотрите класс ProtectedData в MSDN для получения дополнительной информации. Существует отчет DPAPI здесь с большей информацией, чем Вы когда-либо хотели бы.

38
ответ дан 30 November 2019 в 11:38
поделиться

Я хотел бы добавить к подходу DPAPI.

, Хотя я не реализовал подход пользовательского хранилища сам, существует документация Microsoft для подхода пользовательского хранилища, который шифрует и дешифрует данные для определенного пользователя.

я использовал DPAPI использование хранилища машины. Я опишу это в случае, если это соответствует тому, что Вы надеетесь делать. Я использовал службу Windows для загрузки профиля пользователя Windows и что пароль пользователя используется для шифрования данных.

Как примечание стороны, DPAPI использует тройной DES, который может быть немного более слабым (чем AES), но затем я не уверен, какую защиту Вы ищете.

Windows Data Protection http://msdn.microsoft.com/en-us/library/ms995355.aspx

0
ответ дан 30 November 2019 в 11:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: