【问题标题】:How to use encryption in Java? [closed]如何在 Java 中使用加密? [关闭]
【发布时间】:2023-03-12 09:43:01
【问题描述】:

有人知道如何在我的代码中包含加密和解密吗?我将 FileInput 和 FileOutput Stream 用于序列化文件。我有一个学生数组列表,我有一个书籍数组列表。我可以从他们各自的文件中保存和读取它们。但为了安全起见,我想对它们进行加密和解密。我该怎么做?

private static void ReadBook() {
    try {
        FileInputStream fi = new FileInputStream("bookData.ser");
        ObjectInputStream oi = new ObjectInputStream(fi);

        bookList = (ArrayList<Book>) oi.readObject();
        oi.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

protected static void SaveBook(ArrayList<Book> books) {
    ArrayList<Book> tempbookList = books;
    try {
        FileOutputStream fs = new FileOutputStream("bookData.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        os.reset();
        os.writeObject(tempbookList);
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
private static void ReadStudent() {
    try {
        FileInputStream fi = new FileInputStream("studentData.ser");
        ObjectInputStream oi = new ObjectInputStream(fi);

        studentList = (ArrayList<Student>) oi.readObject();
        oi.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}
protected static void SaveStudent(ArrayList<Student> students) {
    ArrayList<Student> tempstudentList = students;
    try {
        FileOutputStream fs = new FileOutputStream("studentData.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        os.reset();
        os.writeObject(tempstudentList);
        os.close();
    } catch (Exception e) {
        e.printStackTrace();
    }

【问题讨论】:

  • 这能回答你的问题吗? En/Decrypting an In/Output stream in Java?
  • A) 请了解 java 命名约定。方法名称也应该是 camelCase()。 B) 定义“安全”。当该代码在您的计算机上运行时,有什么可担心的。如果该代码在某些学校计算机上运行……那么,任何人都可以运行您的程序,然后查看解密的信息?!所以真正的答案是:这在很大程度上取决于您的要求。因为“我想要安全”有很多不同的答案......基本上整本书都是关于这个主题的。
  • 这能回答你的问题吗? How to encrypt String in Java
  • 我的意思是:如果你了解加密,那就找一本好书或教程,开始做研究(有很多东西要学对这个)。但如果这只是你的一些爱好项目:不要把事情复杂化。先把你的基本任务做起来,也许然后,当你真的负担不起时,然后学习加密。

标签: java object encryption arraylist serialization


【解决方案1】:

如果没有外部秘密,您想要的东西是不可能的。问题是,你可以“加密”它,但它实际上并不是加密(只是混淆),除非涉及到密钥,而密钥的意义在于:如果你知道它,你就可以解密它。

那么,钥匙从何而来?您不能将其硬编码到您的源代码中(源代码可以反编译或仅使用十六进制编辑器打开),您不能从文件中加载它(因为任何可以获取加密文件的人也可以使用密钥获取文件在其中,因此现在他们拥有解密数据所需的一切)。您可以尝试在其中添加层,但它一直是乌龟:如果应用程序本身可以获得秘密,并且未经授权的人可以完全访问应用程序运行的计算机,这是不可能的

一种出路是实际上说计算机的所有者并不拥有它 - 这会让我们陷入与苹果 T2 或 Windows 生态系统的 TPM 等安全芯片有关的问题。没有本机代码,您无法从 java 与这些交互。

另一个更简单的方法是确保应用程序无法在没有帮助的情况下解密数据。只需在用户每次启动应用程序时询问他们的密码即可。那么只要打开应用程序,任何黑客都可以只对虚拟机进行内存转储并获取数据,但一旦关闭应用程序并清理内存(有时有点棘手),这又是一个秘密。

首先考虑一下您想要保护哪些场景以及如何保护它们的那些更高级的概念。只有在那之后,才是考虑如何实现这些东西的时候了。

说真的:写下詹姆斯邦德的情景。根据您想要保护的程度对它们进行评分(提示:它不会免费提供)。

例如:如果电脑被偷了,我想说只要电源被拔掉了,而且小偷没有做一些疯狂的事情,比如拉内存芯片,向它喷一罐二氧化碳冻结它们——我希望数据消失——这是可行的。但请注意,这最好由用户自己实现:让操作系统应用全盘加密。他们会比你做得更好,而且他们可以享受安全芯片(例如 TPM 或 T2)的好处。

另一个例子:“有一点知识和进入房间的人,我想阻止这些人查看数据”。这非常很棘手,他们可以使用物理键盘记录器(在键盘和系统之间插入一个很小的 ​​USB 加密狗,或者安装指向屏幕和键盘的摄像头)或者只是打开计算机并安装自定义启动.如果你想把它们排除在外,我们需要讨论保护机箱,或者使用物理警报系统、定制设备或其他极端措施保护房间本身。很高兴知道这种特殊威胁(所谓的“邪恶女仆攻击”)很可能不是您想要防范的(安全涉及权衡。要正确评估权衡,您需要这些场景)。

【讨论】:

    猜你喜欢
    • 2012-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2021-01-04
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多