[ 
https://issues.apache.org/jira/browse/DERBY-3272?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12551800
 ] 

John H. Embretsen commented on DERBY-3272:
------------------------------------------

The tuning guide says that a system-wide property set on the command line 
overrides the same property if set as a database property. Fair enough, since 
this allows you to override a previously set database property temporarily by 
setting the property on the command-line. 

However, it does not say what happens when you actually set a database 
property, and at the same time override the property with a system property. 
From what I can tell from using a debugger, it seems that:

  - when the SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY procedure is 
called/prepared, the doValidateApplyAndMap() method in 
o.a.d.iapi.services.property.PropertyValidation.java "applies" and "maps" the 
new property only if the same property is not also set in the JVM (SET_IN_JVM, 
line 73).

  - the hashing of the password occurs in the "map" method that is being called.

  - when the property is also set as a JVM property, "apply" and "map" is not 
called, but the property is set as a database property anyway.

I am not sure what "apply" and "map" actually means (the javadoc for 
PropertySetCallback.map() says "Map a proposed new value for a property to an 
official value."), but intuitively I find it odd that the property is set in 
this case without being hashed ("mapped"). Stretching it, I may be able to see 
how someone could argue that this is not a bug, but in that case it should be 
made very clear in the manuals how this works.

As indicated earlier, there are two major implications of this issue:

1) Users may think the password is stored securely (hashed) in the database, 
but it is actually stored in cleartext.

2) The current functionality may also lead to authentication failures later on 
if the property is no longer overridden in the JVM, since upon authentication 
the property from the database, which was stored in cleartext, is compared 
against a hashed password supplied by the user, as seen in DERBY-3271.

Opinions are welcome. I hope we can get this cleaned up at some point not too 
far into the future...

> BUILTIN authentication: Passwords stored in a database are not hashed if also 
> defined as system property
> --------------------------------------------------------------------------------------------------------
>
>                 Key: DERBY-3272
>                 URL: https://issues.apache.org/jira/browse/DERBY-3272
>             Project: Derby
>          Issue Type: Bug
>          Components: Security
>    Affects Versions: 10.3.2.1
>         Environment: BUILTIN authentication enabled
>            Reporter: John H. Embretsen
>         Attachments: noPasswordHash.sql
>
>
> Normally, passwords stored as database properties when using Derby's BUILTIN 
> authentication provider are hashed using the well-known SHA-1 algorithm 
> (although this is most likely not mentioned in the documentation). This makes 
> it very hard for attackers to reconstruct the actual password even if they 
> are able to obtain the hashed password value from the database.
> However, if credentials for the same user are also defined programmatically, 
> for example on the command line, the password is not hashed before it is 
> being stored in the database. This could lead to surprises if, for example, a 
> user is using system properties during development, and decides to switch to 
> database properties only before deployment, as recommended in the 
> documentation [1].
> Workaround: Do not specify the same user credentials programmatically when 
> setting credentials as database properties. For example, define a temporary 
> user by using system properties when storing real user credentials in the 
> database.
> [1]: http://db.apache.org/derby/docs/dev/devguide/tdevcsecure82556.html

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to