【问题标题】:Keeping secret information secret对机密信息保密
【发布时间】:2014-03-08 06:23:01
【问题描述】:

所以,我正在编写密码验证程序,从数据库中加载用户名和密码,但我不知道如何将数据库用户名和密码保留在代码之外。

String user = "username";//database username, not username to verify
String password = "password";//my password, not users password to check
String url = "jdbc:mysql://databaseurl:3306/table"; 
//i want this hidden somehow

我可以从文件中加载它,然后人们可以读取该文件。

显然,我不希望人们访问数据库并阅读秘密信息。我该怎么做呢?

编辑:我要问的是,如何保护 MY 数据库 凭据。其他人不应有权访问 数据库

例如,您可以反编译 jar 并阅读以上行,然后使用我的凭据访问我的数据库。 (使用jd-gui等程序)

【问题讨论】:

  • 人们将如何访问您的代码?您是通过在线社区分享它还是仅仅通过他们使用该程序来分享它?
  • 问题是你可以反编译jar,读取数据库用户名和密码,访问数据库并改变你想要的任何东西。我不想要这个。我将进行编辑以澄清。
  • 我建议删除您的问题中关于“密码验证的东西”的误导部分,因为会弹出许多虚假答案。
  • 最好的方法是在您的数据库托管服务器中设计一个层,允许您的应用程序安全地连接和检索数据。数据库登录信息将仅存储在服务器上,以防止被窥探。例如,可以设计一个 PHP 脚本来查询验证,然后 Java 应用程序只需通过网络发送用户的登录凭据,而不是将凭据发送到整个数据库。
  • 我赞同 Vulcan 的说法。您还可以在服务器端添加一些代数检查,以验证登录凭据的来源。这方面的简单示例是使用 PHP(或其他)脚本将每个密码和用户名字符增加一个值 x,这样您在应用程序中使用的密码/用户名是实际密码/用户名的线性变化。

标签: java security


【解决方案1】:

使用密码加密。 如果您的应用程序在 J2EE 容器中运行,请使用标准工具

Look at sample for Jboss container

【讨论】:

  • @MarkusMalkusch 我不是反对者,但它也不能解决问题,只是让获取密码有点困难。
  • 我最初对这个答案投了反对票,因为除了阻止最不积极的潜在黑客之外,简单地加密密码完全没有用。如果答案是指通过 J2EE 设置 Web 服务以将数据库凭据保存在服务器上,则需要添加更多细节以使此答案有用。
  • 我不是安全专家,但 popalka 建议的绝对是专家提出的安全准则之一。来自我的 +1。
【解决方案2】:

如果您要让用户直接访问数据库,为什么不将您传递给数据库的用户名/密码设为用户的实际用户名/数据库?

通常在安全系统中,数据库不会直接向用户公开。用户将查询传递给某个系统,然后该系统执行身份验证,然后如果传递则将查询传递给数据库。

换句话说,如果您依赖隐藏数据库登录凭据作为访问数据库的障碍,那么您依赖于客户端在实际查询数据库时对其自身进行身份验证,这很糟糕, 馊主意。一旦你的数据库的登录凭据被泄露,你的整个安全方案现在就失败了。

【讨论】:

    【解决方案3】:

    您可以将数据库详细信息保存在一个

    属性文件/数据库

    。它是一种抽象层。在该属性文件/数据库中,您提供一些不同的键,以便在访问数据库时,从属性文件/数据库中获取键/列并构造 url 信息。

    【讨论】:

    • 有权访问 WAR 也会导致该属性文件。
    • 将凭据与程序分开可以至少定期轻松更改密码。因此,最好将其嵌入到代码中。我也会把它放在战争之外。
    • 如果您想远离应用程序,那么我建议将其保存在加密的数据库中。这将使您完全控制安全方面
    【解决方案4】:

    使用带有正确签名证书的 PKI 交换来保护您的身份验证和授权服务(因此,如果出现问题,它可以被撤销,当然也可以)。

    一个例子是 ws-security(一个 SOAP 扩展),但是如果您需要使用 REST,那么您会遇到传输级别的安全问题(使用 HTTPS 保护您的连接)。

    您可能想阅读http://security.stackexchange.com 以获得更深入的评论,而不是“将其存储在属性文件中。

    【讨论】:

    • 但是你必须将私钥存储在某个地方 - 基本上是同样的问题。
    • 如果您无法访问这两个私钥,则公钥交换对于除签名验证之外的所有内容都没有实际意义。
    猜你喜欢
    • 1970-01-01
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多