oracle - 在 sql 语句和 callablestatement 中传递密码的安全问题

标签 oracle security jdbc

我计划将密码散列保存在我的数据库中,而不是纯文本。我关心的是当我在准备好的语句中从 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/

相关文章:

java - JDBC 检查连接是否可以保证它将无错误地提交

oracle - Grails 与 Oracle-DB : seems to have only one global counter for IDs

"WITH"子句的 SQL 语法错误

security - Symfony2 SonataAdminBundle 密码字段加密

java - 如何在 Java servlet 的插入查询中将字符串类型转换为二进制类型

postgresql - jOOQ 时间戳与本地时区偏移一起存储

Oracle:如何查明是否有待处理的事务?

oracle - Plsql 将数字(货币)拼写为意大利货币,无需硬编码翻译数字

security - 如何将cloudera apache sentry与open ldap集成

c# - 作为系统执行任务?