我计划将密码散列保存在我的数据库中,而不是纯文本。我关心的是当我在准备好的语句中从 JDBC 执行查询时,例如:
SELECT username FROM users WHERE username = 'userName'
and password = dbms_crypto.hash(utl_raw.cast_to_raw('password'),3);
或
INSERT INTO users VALUES ('username', dbms_crypto.hash(utl_raw.cast_to_raw('passowrd'),3);
或者如果我调用 PLSQL 过程,它希望我传递明文密码,那么这些过程将在其主体中包含如上所述的查询。我担心有人可以利用 JDBC 通过这些查询从我的服务器发送到我的数据库的密码。使用准备好的语句或 plsql 过程来克服这个安全问题是否更好?或者我应该首先使用 java 代码对密码进行哈希处理,然后传递这些密码进行插入或选择?
最佳答案
克服您引用的安全问题的唯一方法是在通过网络发送密码之前在服务器端预先对其进行哈希处理。
这是最佳实践。
但是 dbms_crypto.hash
对于密码存储来说不安全,您不应该使用它。相反,您应该使用具有适当盐和成本的 BCrypt。在服务器代码中生成 bcrypt 哈希,然后将其发送到已哈希的数据库(用于插入)或使用用户名从数据库中提取哈希(用于选择)。
此外,我想指出,如果攻击者能够足够接近您的数据库以查看您正在其上运行的查询,那么这将是一个严重问题。虽然我是纵深防御的拥护者,所以您应该防范这种可能性,但如果这种情况确实发生,那就是一个大问题。
关于oracle - 在 sql 语句和 callablestatement 中传递密码的安全问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27416497/