存储批处理作业的密码

时间:2009-07-31 08:39:25

标签: java passwords scheduled-tasks

我有一个使用需要授权的web服务的java编程。所以java prog(使用Windows任务调度程序运行)需要有一个用户/密码参数。如何将这些存储在某个地方而不将它们作为明文放在文件中?

到目前为止,我已尝试使用runtime.getRuntime和CACLS来创建纯文本文件,但更改了权限,因此只有所有者可以打开它(不起作用,不确定原因)。

密码加密不起作用,因为如果我将散列传递给webservice,webservice只是“错误的什么?拒绝,迷路”,但如果我使用密钥加密,你需要一个密码来解密密码。我在哪里存储它。 :P

帮助?请? :)

感谢。

5 个答案:

答案 0 :(得分:2)

简单的答案是:

您无法使完全安全,但您可以稍微更安全安全。

您无法对密码进行哈希处理,因为这会阻止您的程序使用密码。

您可以将密码放在文件中,并使用操作系统权限保护文件。您需要允许进程执行您的程序读取访问权限。这可以防止没有管理员权限的任何人查看密码。

您可以加密密码并在程序中提供密钥。这可以防止那些能够读取文件但不会停止(甚至减慢很多)有权访问密码和程序的人随意查看密码。

其他任何东西或多或少都是戏剧。

答案 1 :(得分:1)

  

我怎样才能将它们存储在某个地方而不会让它们作为明文躺在文件中?

没有“文件”存储将是困难的。无论如何,您必须从某个位置检索密码。

  • 使用一些symetric加密 混淆所以快速哈希不会 透露您的密码
  • 使用OS文件系统(对用户是只读的) 使用该程序,无法访问所有 另外)保护本地磁盘上的文件或将其放在外部驱动器(闪存)上。

答案 2 :(得分:1)

如果有人有权访问正在运行的计算机,则无法安全地保存密码。保持密码在内存中的某处加密是我认为最安全的方式,就像上面提到的运行即服务解决方案一样。

对于更复杂的方法,您可以创建一个守护进程,它允许您键入密码,将其加密到内存中,并通过IPC(套接字)将加密的文本传递给您的java程序,然后您的程序将解密它使用。但我永远不会这样做...... Hihihi ......

答案 3 :(得分:0)

两个问题:

  1. 为什么需要将它们存储在程序外部?为什么不在Java程序中编码(您或用户是否需要更改它们?)
  2. 您可以在外部存储它们,但加密吗?例如,您可以使用公钥进行加密,并将私钥存储在程序本身中。因此编码对的可见性无关紧要。
  3. 无论采用哪种方法,都会遇到问题,因为您可以轻松反汇编 Java程序。无论您选择哪种方法,反汇编都会使其易受攻击。

答案 4 :(得分:0)

选项是不使用Windows任务计划程序,而是将程序作为服务。这样,您可以使用密码作为参数启动服务一次。然后密码保留在内存中以供您的服务使用,您不再需要存储它。

使用Java Service Wrapper

可以非常轻松地将程序设置为服务