Oracle函数中的加密/解密密码

Vic*_*tor 4 oracle encryption plsql

由于以前设计不合理的结构,我必须使用的当前数据库将用户的密码存储为文本.

现在,我正在构建一个必须使用这些密码的前端部分,我当然不希望发送未加密的密码.

我的想法是编写一个Oracle函数来加密和解密文本密码,并在存储过程中使用这些函数来返回加密数据.

Oracle中最好的方法是什么?

Jus*_*ave 7

如果您想编写自己的函数来加密和解密数据,您只需要使用适当的参数调用DBMS_CRYPTO encryptdecrypt方法(即选择加密算法,密钥等).

当然,如果您编写自己的例程,假设您将密钥存储在数据库中或数据库可以访问的某个位置,那么您在安全性方面做得并不多.通过网络发送未加密的密码是不好的,但在数据库中存储未加密的密码通常要糟糕得多(如果decrypt数据库中有一个方法可以访问密钥来解​​密数据,则加密密码).从数据库中窃取数据通常要比通过网络发送数据以便查找密码容易得多.

当然,正确的答案是重新架构系统,以便您根本不存储密码.您应该存储密码哈希值(您也可以使用该DBMS_CRYPTO程序包生成),这些密码哈希值是不可逆的.


cag*_*boy 6

看看DBMS_CRYPTO

它有加密和解密内置数据的方法.比编写自己的方法更好.

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_crypto.htm


Jor*_*ram 5

或者您可以使用密码哈希算法 pbkdf2,如下所示http://mikepargeter.wordpress.com/2012/11/26/pbkdf2-in-oracle/我使用 rfc https://www.ietf.org/ 验证了结果rfc/rfc6070.txt并且工作正常。

检查此链接以了解最小迭代次数和 key_size:PBKDF2 建议的密钥大小? 请注意,结果是长度的两倍,因为它是十六进制编码的。

我们将这些列存储在数据库中

PASSWORD_HASH                 VARCHAR2(512 BYTE),
PASSWORD_SALT                 VARCHAR2(256 BYTE),
PASSWORD_ITERATIONS           NUMBER(10),
PASSWORD_HASH_METHOD          VARCHAR2(30 BYTE),
PASSWORD_CHANGED_DT           DATE
Run Code Online (Sandbox Code Playgroud)

hash、salt 和 iterations 用于提供 pbkdf2 算法 hash_method 用于迁移目的,changed_dt 用于使密码过期