从程序登录到db时自动加密和解密

时间:2016-08-07 17:32:50

标签: encryption plsql

我正在考虑这种特殊情况。

假设我有一个名为db_passwords的表,它存储不同数据库的密码。现在我担心任何人都可以通过编写一个简单的选择语句来查看这些密码。同时,我希望能够从程序连接到特定数据库。

我知道有一些oracle加密软件包可以加密特定的列,借助它可以加密一个表的特定列,并且通过密钥帮助完成对db的记录。 但我无法清楚地了解在这种情况下会发生什么,比如, 对于要连接到db的特定代码行,如下所示: sql>使用“db_name”连接到“password”标识的“username”。 在上面的语句中,代替密码,我应该输入密钥,如果我输入密钥,pl / sql会自动解密吗? 期待您的插图和见解,了解在这种情况下究竟发生了什么。

1 个答案:

答案 0 :(得分:0)

修改

好的,我误解了你的问题。我以为你正在创建一个登录表单,想知道如何存储用户密码。我现在明白你只想将数据库的密码存储在其他数据库中。

而且,如果不应该知道其他数据库密码的人可以访问这个“密码数据库”,那么简单的答案是:将它们存储在那里。

当然,正如您所指出的,通过在数据库中以明文形式存储密码,任何人都可以看到它们。但是,您需要了解的是,加密它们无论如何都无济于事。如果你加密它们,那么你的应用程序将需要能够解密它们(也就是说,你的应用程序需要知道密钥)。如果您的应用程序知道密钥,那么任何有权访问您的源代码的人都可以获取该密钥,然后解密存储在数据库中的密码。

你应该做的是将它们只存储在那些应该知道密码有权访问的地方。例如,您可以将它们存储在加密的配置文件中。应该以只有正确的OS用户(例如root)可以读取它的方式设置该文件的权限。然后您的应用程序将从该文件中读取密码。

您应该在将密码保存到数据库之前对其进行哈希处理(理想情况下是在应用程序级别)。通过散列,您可以将给定的输入字符串转换为具有固定长度的另一个输入字符串。生成的字符串[理想情况下]永远不会发生冲突,这意味着“password123”将生成一个字符串,而“password1234”将生成另一个完全不同的字符串。

当用户想要登录时,您再次散列他提供的密码并将其与存储在数据库中的散列进行比较。如果它们相等,那么密码是正确的。

如果出于某种原因,您无法在应用程序级别进行哈希处理,则可以使用PL / SQL的内置哈希函数(documentation)。

请注意,如果您使用SHA512进行哈希并将其直接存储在数据库中,仍然有办法发现原始密码。要真正使您的密码安全,即使他们可以访问您的数据库,也无法通过使用随机盐对密码进行散列来“解密”它们。如果您想了解更多相关信息,可以阅读bcrypt