neobytes/doc/keepass.md
UdjinM6 1448506570
Switch KeePassHttp integration to new AES lib, add tests and a note about KeePassHttp security (#1818)
* Add a note about KeePassHttp security

* Use new AES lib instead of OpenSSL for KeePassHttp encryption/decryption

* Add tests to make sure new AES lib works corrctly for KeePassHttp encryption/decryption and produces the same results as OpenSSL did
2017-12-29 01:10:34 +03:00

4.1 KiB

What is it about

More info regarding KeePass: http://keepass.info/

KeePass integration use KeePassHttp (https://github.com/pfn/keepasshttp/) to facilitate communications between the client and KeePass. KeePassHttp is a plugin for KeePass 2.x and provides a secure means of exposing KeePass entries via HTTP for clients to consume.

The implementation is dependent on the following:

  • crypter.h for AES encryption helper functions.
  • rpcprotocol.h for handling RPC communications. Could only be used partially however due some static values in the code.
  • OpenSSL for base64 encoding. regular util.h libraries were not used for base64 encoding/decoding since they do not use secure allocation.
  • JSON Spirit for reading / writing RPC communications

A note about security

Every connection to KeePassHTTP server is done via plain HTTP and even though protocol uses some internal encryption it should not be considered to be a highly secure one. This protocol has certain flaw which allow an attacker to decrypt your passwords when they manage to intercept communication between a KeePassHTTP server over a network connection (see here and here). Dash Core therefore strictly limits communication between itself and KeePassHttp to your local computer. As long as your computer is not compromised, your wallet passphrase is as safe as if you would enter it directly.

What's new

The following new options are available for dashd and dash-qt:

  • -keepass Use KeePass 2 integration using KeePassHttp plugin (default: 0)
  • -keepassport= Connect to KeePassHttp on port (default: 19455)
  • -keepasskey= KeePassHttp key for AES encrypted communication with KeePass
  • -keepassid= KeePassHttp id for the established association
  • -keepassname= Name to construct url for KeePass entry that stores the wallet passphrase

The following rpc commands are available:

  • keepass genkey: generates a base64 encoded 256 bit AES key that can be used for the communication with KeePassHttp. Only necessary for manual configuration. Use init for automatic configuration.
  • keepass init: sets up the association between dashd and keepass by generating an AES key and sending an association message to KeePassHttp. This will trigger KeePass to ask for an Id for the association. Returns the association and the base64 encoded string for the AES key.
  • keepass setpassphrase: updates the passphrase in KeePassHttp to a new value. This should match the passphrase you intend to use for the wallet. Please note that the standard RPC commands walletpassphrasechange and the wallet encrption from the QT GUI already send the updates to KeePassHttp, so this is only necessary for manual manipulation of the password.

How to setup

Sample initialization flow from dash-qt console (this needs to be done only once to set up the association):

  • Have KeePass running with an open database
  • Start dash-qt
  • Open console
  • Type "keepass init" in dash-qt console
  • Keepass pops up and asks for an association id, fill that in, for example, "mydrkwallet"
  • You should get a response like this "Association successful. Id: mydrkwalletdash - Key: AgQkcs6cI7v9tlSYKjG/+s8wJrGALHl3jLosJpPLzUE="
  • Edit dash.conf and fill in these values
keepass=1
keepasskey=AgQkcs6cI7v9tlSYKjG/+s8wJrGALHl3jLosJpPLzUE=
keepassid=mydrkwallet
keepassname=testwallet
  • Restart dash-qt

At this point, the association is made. The next action depends on your particular situation:

  • current wallet is not yet encrypted. Encrypting the wallet will trigger the integration and stores the password in KeePass (Under the 'KeePassHttp Passwords' group, named after keepassname.
  • current wallet is already encrypted: use "keepass setpassphrase" to store the passphrase in KeePass.

At this point, the passphrase is stored in KeePassHttp. When Unlocking the wallet, one can use keepass as the passphrase to trigger retrieval of the password. This works from the RPC commands as well as the GUI.

Extended guide with screenshots is also available: https://dashtalk.org/threads/keepass-integration.3620/