mirror of
https://git.sekbaer.de/Friendica/friendica.git
synced 2025-06-10 09:04:26 +02:00
Add defuse/php-encryption 2.0 to Composer dependencies
This commit is contained in:
parent
ede20ac95a
commit
3b2cd85483
61 changed files with 6289 additions and 1 deletions
64
vendor/defuse/php-encryption/docs/CryptoDetails.md
vendored
Normal file
64
vendor/defuse/php-encryption/docs/CryptoDetails.md
vendored
Normal file
|
@ -0,0 +1,64 @@
|
|||
Cryptography Details
|
||||
=====================
|
||||
|
||||
Here is a high-level description of how this library works. Any discrepancy
|
||||
between this documentation and the actual implementation will be considered
|
||||
a security bug.
|
||||
|
||||
Let's start with the following definitions:
|
||||
|
||||
- HKDF-SHA256(*k*, *n*, *info*, *s*) is the key derivation function specified in
|
||||
RFC 5869 (using the SHA256 hash function). The parameters are:
|
||||
- *k*: The initial keying material.
|
||||
- *n*: The number of output bytes.
|
||||
- *info*: The info string.
|
||||
- *s*: The salt.
|
||||
- AES-256-CTR(*m*, *k*, *iv*) is AES-256 encryption in CTR mode. The parameters
|
||||
are:
|
||||
- *m*: An arbitrary-length (possibly zero-length) message.
|
||||
- *k*: A 32-byte key.
|
||||
- *iv*: A 16-byte initialization vector (nonce).
|
||||
- PBKDF2-SHA256(*p*, *s*, *i*, *n*) is the password-based key derivation
|
||||
function defined in RFC 2898 (using the SHA256 hash function). The parameters
|
||||
are:
|
||||
- *p*: The password string.
|
||||
- *s*: The salt string.
|
||||
- *i*: The iteration count.
|
||||
- *n*: The output length in bytes.
|
||||
- VERSION is the string `"\xDE\xF5\x02\x00"`.
|
||||
- AUTHINFO is the string `"DefusePHP|V2|KeyForAuthentication"`.
|
||||
- ENCRINFO is the string `"DefusePHP|V2|KeyForEncryption"`.
|
||||
|
||||
To encrypt a message *m* using a 32-byte key *k*, the following steps are taken:
|
||||
|
||||
1. Generate a random 32-byte string *salt*.
|
||||
2. Derive the 32-byte authentication key *akey* = HKDF-SHA256(*k*, 32, AUTHINFO, *salt*).
|
||||
3. Derive the 32-byte encryption key *ekey* = HKDF-SHA256(*k*, 32, ENCRINFO, *salt*).
|
||||
4. Generate a random 16-byte initialization vector *iv*.
|
||||
5. Compute *c* = AES-256-CTR(*m*, *ekey*, *iv*).
|
||||
6. Combine *ctxt* = VERSION || *salt* || *iv* || *c*.
|
||||
7. Compute *h* = HMAC-SHA256(*ctxt*, *akey*).
|
||||
8. Output *ctxt* || *h*.
|
||||
|
||||
Decryption is roughly the reverse process (see the code for details, since the
|
||||
security of the decryption routine is highly implementation-dependent).
|
||||
|
||||
For encryption using a password *p*, steps 1-3 above are replaced by:
|
||||
|
||||
1. Generate a random 32-byte string *salt*.
|
||||
2. Compute *k* = PBKDF2-SHA256(SHA256(*p*), *salt*, 100000, 32).
|
||||
3. Derive the 32-byte authentication key *akey* = HKDF-SHA256(*k*, 32, AUTHINFO, *salt*)
|
||||
4. Derive the 32-byte encryption key *ekey* = HKDF-SHA256(*k*, 32, ENCRINFO, *salt*)
|
||||
|
||||
The remainder of the process is the same. Notice the reuse of the same *salt*
|
||||
for PBKDF2-SHA256 and HKDF-SHA256. The prehashing of the password in step 2 is
|
||||
done to prevent a [DoS attack using long
|
||||
passwords](https://github.com/defuse/php-encryption/issues/230).
|
||||
|
||||
For `KeyProtectedByPassword`, the serialized key is encrypted according to the
|
||||
password encryption defined above. However, the actual password used for
|
||||
encryption is the SHA256 hash of the password the user provided. This is done in
|
||||
order to provide domain separation between the message encryption in the user's
|
||||
application and the internal key encryption done by this library. It fixes
|
||||
a [key replacement chosen-protocol
|
||||
attack](https://github.com/defuse/php-encryption/issues/240).
|
39
vendor/defuse/php-encryption/docs/FAQ.md
vendored
Normal file
39
vendor/defuse/php-encryption/docs/FAQ.md
vendored
Normal file
|
@ -0,0 +1,39 @@
|
|||
Frequently Asked Questions
|
||||
===========================
|
||||
|
||||
How do I use this library to encrypt passwords?
|
||||
------------------------------------------------
|
||||
|
||||
Passwords should not be encrypted, they should be hashed with a *slow* password
|
||||
hashing function that's designed to slow down password guessing attacks. See
|
||||
[How to Safely Store Your Users' Passwords in
|
||||
2016](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016).
|
||||
|
||||
How do I give it the same key every time instead of a new random key?
|
||||
----------------------------------------------------------------------
|
||||
|
||||
A `Key` object can be saved to a string by calling its `saveToAsciiSafeString()`
|
||||
method. You will have to save that string somewhere safe, and then load it back
|
||||
into a `Key` object using `Key`'s `loadFromAsciiSafeString` static method.
|
||||
|
||||
Where you store the string depends on your application. For example if you are
|
||||
using `KeyProtectedByPassword` to encrypt files with a user's login password,
|
||||
then you should not store the `Key` at all. If you are protecting sensitive data
|
||||
on a server that may be compromised, then you should store it in a hardware
|
||||
security module. When in doubt, consult a security expert.
|
||||
|
||||
Why is an EnvironmentIsBrokenException getting thrown?
|
||||
-------------------------------------------------------
|
||||
|
||||
Either you've encountered a bug in this library, or your system doesn't support
|
||||
the use of this library. For example, if your system does not have a secure
|
||||
random number generator, this library will refuse to run, by throwing that
|
||||
exception, instead of falling back to an insecure random number generator.
|
||||
|
||||
Why am I getting a BadFormatException when loading a Key from a string?
|
||||
------------------------------------------------------------------------
|
||||
|
||||
If you're getting this exception, then the string you're giving to
|
||||
`loadFromAsciiSafeString()` is *not* the same as the string you got from
|
||||
`saveToAsciiSafeString()`. Perhaps your database column isn't wide enough and
|
||||
it's truncating the string as you insert it?
|
53
vendor/defuse/php-encryption/docs/InstallingAndVerifying.md
vendored
Normal file
53
vendor/defuse/php-encryption/docs/InstallingAndVerifying.md
vendored
Normal file
|
@ -0,0 +1,53 @@
|
|||
Getting The Code
|
||||
=================
|
||||
|
||||
There are two ways to use this library in your applications. You can either:
|
||||
|
||||
1. Use [Composer](https://getcomposer.org/), or
|
||||
2. `require_once` a single `.phar` file in your application.
|
||||
|
||||
If you are not using either option (for example, because you're using Git submodules), you may need to write your own autoloader ([example](https://gist.github.com/paragonie-scott/949daee819bb7f19c50e5e103170b400)).
|
||||
|
||||
Option 1: Using Composer
|
||||
-------------------------
|
||||
|
||||
Run this inside the directory of your composer-enabled project:
|
||||
|
||||
```sh
|
||||
composer require defuse/php-encryption
|
||||
```
|
||||
|
||||
Unfortunately, composer doesn't provide a way for you to verify that the code
|
||||
you're getting was signed by this library's authors. If you want a more secure
|
||||
option, use the `.phar` method described below.
|
||||
|
||||
Option 2: Including a PHAR
|
||||
----------------------------
|
||||
|
||||
The `.phar` option lets you include this library into your project simply by
|
||||
calling `require_once` on a single file. Download `defuse-crypto.phar` and
|
||||
`defuse-crypto.phar.sig` from this project's
|
||||
[releases](https://github.com/defuse/php-encryption/releases) page.
|
||||
|
||||
You should verify the integrity of the `.phar`. The `defuse-crypto.phar.sig`
|
||||
contains the signature of `defuse-crypto.phar`. It is signed with Taylor
|
||||
Hornby's PGP key. You can find Taylor's public key in `dist/signingkey.asc`. You
|
||||
can verify the public key's fingerprint against the Taylor Hornby's [contact
|
||||
page](https://defuse.ca/contact.htm) and
|
||||
[twitter](https://twitter.com/DefuseSec/status/723741424253059074).
|
||||
|
||||
Once you have verified the signature, it is safe to use the `.phar`. Place it
|
||||
somewhere in your file system, e.g. `/var/www/lib/defuse-crypto.phar`, and then
|
||||
pass that path to `require_once`.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
require_once('/var/www/lib/defuse-crypto.phar');
|
||||
|
||||
// ... the Crypto, File, Key, and KeyProtectedByPassword classes are now
|
||||
// available ...
|
||||
|
||||
// ...
|
||||
```
|
||||
|
160
vendor/defuse/php-encryption/docs/InternalDeveloperDocs.md
vendored
Normal file
160
vendor/defuse/php-encryption/docs/InternalDeveloperDocs.md
vendored
Normal file
|
@ -0,0 +1,160 @@
|
|||
Information for the Developers of php-encryption
|
||||
=================================================
|
||||
|
||||
Status
|
||||
-------
|
||||
|
||||
This library is currently frozen under a long-term support release. We do not
|
||||
plan to add any new features. We will maintain the library by fixing any bugs
|
||||
that are reported, or security vulnerabilities that are found.
|
||||
|
||||
Development Environment
|
||||
------------------------
|
||||
|
||||
Development is done on Linux. To run the tests, you will need to have the
|
||||
following tools installed:
|
||||
|
||||
- `php` (with OpenSSL enabled, if you're compiling from source).
|
||||
- `gpg`
|
||||
- `composer`
|
||||
|
||||
Running the Tests
|
||||
------------------
|
||||
|
||||
First do `composer install` and then you can run the tests by running
|
||||
`./test.sh`. This will download a PHPUnit PHAR, verify its cryptographic
|
||||
signatures, and then use it to run the tests in `test/unit`.
|
||||
|
||||
Getting and Using Psalm
|
||||
-----------------------
|
||||
|
||||
[Psalm](https://github.com/vimeo/psalm) is a static analysis suite for PHP projects.
|
||||
We use Psalm to ensure type safety throughout our library.
|
||||
|
||||
To install Psalm, you just need to run one command:
|
||||
|
||||
composer require --dev "vimeo/psalm:dev-master"
|
||||
|
||||
To verify that your code changes are still strictly type-safe, run the following
|
||||
command:
|
||||
|
||||
vendor/bin/psalm
|
||||
|
||||
Reporting Bugs
|
||||
---------------
|
||||
|
||||
Please report bugs, even critical security vulnerabilities, by opening an issue
|
||||
on GitHub. We recommend disclosing security vulnerabilities found in this
|
||||
library *publicly* as soon as possible.
|
||||
|
||||
Philosophy
|
||||
-----------
|
||||
|
||||
This library is developed around several core values:
|
||||
|
||||
- Rule #1: Security is prioritized over everything else.
|
||||
|
||||
> Whenever there is a conflict between security and some other property,
|
||||
> security will be favored. For example, the library has runtime tests,
|
||||
> which make it slower, but will hopefully stop it from encrypting stuff
|
||||
> if the platform it's running on is broken.
|
||||
|
||||
- Rule #2: It should be difficult to misuse the library.
|
||||
|
||||
> We assume the developers using this library have no experience with
|
||||
> cryptography. We only assume that they know that the "key" is something
|
||||
> you need to encrypt and decrypt the messages, and that it must be kept
|
||||
> secret. Whenever possible, the library should refuse to encrypt or decrypt
|
||||
> messages when it is not being used correctly.
|
||||
|
||||
- Rule #3: The library aims only to be compatible with itself.
|
||||
|
||||
> Other PHP encryption libraries try to support every possible type of
|
||||
> encryption, even the insecure ones (e.g. ECB mode). Because there are so
|
||||
> many options, inexperienced developers must decide whether to use "CBC
|
||||
> mode" or "ECB mode" when both are meaningless terms to them. This
|
||||
> inevitably leads to vulnerabilities.
|
||||
|
||||
> This library will only support one secure mode. A developer using this
|
||||
> library will call "encrypt" and "decrypt" methods without worrying about
|
||||
> how they are implemented.
|
||||
|
||||
- Rule #4: The library should require no special installation.
|
||||
|
||||
> Some PHP encryption libraries, like libsodium-php, are not straightforward
|
||||
> to install and cannot packaged with "just download and extract"
|
||||
> applications. This library will always be just a handful of PHP files that
|
||||
> you can copy to your source tree and require().
|
||||
|
||||
Publishing Releases
|
||||
--------------------
|
||||
|
||||
To make a release, you will need to install [composer](https://getcomposer.org/)
|
||||
and [box](https://github.com/box-project/box2) on your system. They will need to
|
||||
be available in your `$PATH` so that running the commands `composer` and `box`
|
||||
in your terminal run them, respectively. You will also need the private key for
|
||||
signing (ID: 7B4B2D98) available.
|
||||
|
||||
Once you have those tools installed and the key available follow these steps:
|
||||
|
||||
**Remember to set the version number in `composer.json`!**
|
||||
|
||||
Make a fresh clone of the repository:
|
||||
|
||||
```
|
||||
git clone <url>
|
||||
```
|
||||
|
||||
Check out the branch you want to release:
|
||||
|
||||
```
|
||||
git checkout <branchname>
|
||||
```
|
||||
|
||||
Check that the version number in composer.json is correct:
|
||||
|
||||
```
|
||||
cat composer.json
|
||||
```
|
||||
|
||||
Run the tests:
|
||||
|
||||
```
|
||||
composer install
|
||||
./test.sh
|
||||
```
|
||||
|
||||
Generate the `.phar`:
|
||||
|
||||
```
|
||||
cd dist
|
||||
make build-phar
|
||||
```
|
||||
|
||||
Test the `.phar`:
|
||||
|
||||
```
|
||||
cd ../
|
||||
./test.sh dist/defuse-crypto.phar
|
||||
```
|
||||
|
||||
Sign the `.phar`:
|
||||
|
||||
```
|
||||
cd dist
|
||||
make sign-phar
|
||||
```
|
||||
|
||||
Tag the release:
|
||||
|
||||
```
|
||||
git -c user.signingkey=7B4B2D98 tag -s "<TAG NAME>" -m "<TAG MESSAGE>"
|
||||
```
|
||||
|
||||
`<TAG NAME>` should be in the format `v2.0.0` and `<TAG MESSAGE>` should look
|
||||
like "Release of v2.0.0."
|
||||
|
||||
Push the tag to github, then use the
|
||||
[releases](https://github.com/defuse/php-encryption/releases) page to draft
|
||||
a new release for that tag. Upload the `.phar` and the `.phar.sig` file to be
|
||||
included as part of that release.
|
298
vendor/defuse/php-encryption/docs/Tutorial.md
vendored
Normal file
298
vendor/defuse/php-encryption/docs/Tutorial.md
vendored
Normal file
|
@ -0,0 +1,298 @@
|
|||
Tutorial
|
||||
=========
|
||||
|
||||
Hello! If you're reading this file, it's because you want to add encryption to
|
||||
one of your PHP projects. My job, as the person writing this documentation, is
|
||||
to help you make sure you're doing the right thing and then show you how to use
|
||||
this library to do it. To help me help you, please read the documentation
|
||||
*carefully* and *deliberately*.
|
||||
|
||||
A Word of Caution
|
||||
------------------
|
||||
|
||||
Encryption is not magic dust you can sprinkle on a system to make it more
|
||||
secure. The way encryption is integrated into a system's design needs to be
|
||||
carefully thought out. Sometimes, encryption is the wrong thing to use. Other
|
||||
times, encryption needs to be used in a very specific way in order for it to
|
||||
work as intended. Even if you are sure of what you are doing, we strongly
|
||||
recommend seeking advice from an expert.
|
||||
|
||||
The first step is to think about your application's threat model. Ask yourself
|
||||
the following questions. Who will want to attack my application, and what will
|
||||
they get out of it? Are they trying to steal some information? Trying to alter
|
||||
or destroy some information? Or just trying to make the system go down so people
|
||||
can't access it? Then ask yourself how encryption can help combat those threats.
|
||||
If you're going to add encryption to your application, you should have a very
|
||||
clear idea of exactly which kinds of attacks it's helping to secure your
|
||||
application against. Once you have your threat model, think about what kinds of
|
||||
attacks it *does not* cover, and whether or not you should improve your threat
|
||||
model to include those attacks.
|
||||
|
||||
**This isn't for storing user login passwords:** The most common use of
|
||||
cryptography in web applications is to protect the users' login passwords. If
|
||||
you're trying to use this library to "encrypt" your users' passwords, you're in
|
||||
the wrong place. Passwords shouldn't be *encrypted*, they should be *hashed*
|
||||
with a slow computation-heavy function that makes password guessing attacks more
|
||||
expensive. See [How to Safely Store Your Users' Passwords in
|
||||
2016](https://paragonie.com/blog/2016/02/how-safely-store-password-in-2016).
|
||||
|
||||
**This isn't for encrypting network communication:** Likewise, if you're trying
|
||||
to encrypt messages sent between two parties over the Internet, you don't want
|
||||
to be using this library. For that, set up a TLS connection between the two
|
||||
points, or, if it's a chat app, use the [Signal
|
||||
Protocol](https://whispersystems.org/blog/advanced-ratcheting/).
|
||||
|
||||
What this library provides is symmetric encryption for "data at rest." This
|
||||
means it is not suitable for use in building protocols where "data is in motion"
|
||||
(i.e. moving over a network) except in limited set of cases.
|
||||
|
||||
Getting the Code
|
||||
-----------------
|
||||
|
||||
There are several different ways to obtain this library's code and to add it to
|
||||
your project. Even if you've already cloned the code from GitHub, you should
|
||||
take steps to verify the cryptographic signatures to make sure the code you got
|
||||
was not intercepted and modified by an attacker.
|
||||
|
||||
Please head over to the [**Installing and
|
||||
Verifying**](InstallingAndVerifying.md) documentation to get the code, and then
|
||||
come back here to continue the tutorial.
|
||||
|
||||
Using the Library
|
||||
------------------
|
||||
|
||||
I'm going to assume you know what symmetric encryption is, and the difference
|
||||
between symmetric and asymmetric encryption. If you don't, I recommend taking
|
||||
[Dan Boneh's Cryptography I course](https://www.coursera.org/learn/crypto/) on
|
||||
Coursera.
|
||||
|
||||
To give you a quick introduction to the library, I'm going to explain how it
|
||||
would be used in two sterotypical scenarios. Hopefully, one of these sterotypes
|
||||
is close enough to what you want to do that you'll be able to figure out what
|
||||
needs to be different on your own.
|
||||
|
||||
### Formal Documentation
|
||||
|
||||
While this tutorial should get you up and running fast, it's important to
|
||||
understand how this library behaves. Please make sure to read the formal
|
||||
documentation of all of the functions you're using, since there are some
|
||||
important security warnings there.
|
||||
|
||||
The following classes are available for you to use:
|
||||
|
||||
- [Crypto](classes/Crypto.md): Encrypting and decrypting strings.
|
||||
- [File](classes/File.md): Encrypting and decrypting files.
|
||||
- [Key](classes/Key.md): Represents a secret encryption key.
|
||||
- [KeyProtectedByPassword](classes/KeyProtectedByPassword.md): Represents
|
||||
a secret encryption key that needs to be "unlocked" by a password before it
|
||||
can be used.
|
||||
|
||||
### Scenario #1: Keep data secret from the database administrator
|
||||
|
||||
In this scenario, our threat model is as follows. Alice is a server
|
||||
administrator responsible for managing a trusted web server. Eve is a database
|
||||
administrator responsible for managing a database server. Dave is a web
|
||||
developer working on code that will eventually run on the trusted web server.
|
||||
|
||||
Let's say Alice and Dave trust each other, and Alice is going to host Dave's
|
||||
application on her server. But both Alice and Dave don't trust Eve. They know
|
||||
Eve is a good database administrator, but she might have incentive to steal the
|
||||
data from the database. They want to keep some of the web application's data
|
||||
secret from Eve.
|
||||
|
||||
In order to do that, Alice will use the included `generate-defuse-key` script
|
||||
which generates a random encryption key and prints it to standard output:
|
||||
|
||||
```sh
|
||||
$ composer require defuse/php-encryption
|
||||
$ vendor/bin/generate-defuse-key
|
||||
```
|
||||
|
||||
Alice will run this script once and save the output to a configuration file, say
|
||||
in `/etc/daveapp-secret-key.txt` and set the file permissions so that only the
|
||||
user that the website PHP scripts run as can access it.
|
||||
|
||||
Dave will write his code to load the key from the configuration file:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\Key;
|
||||
|
||||
function loadEncryptionKeyFromConfig()
|
||||
{
|
||||
$keyAscii = // ... load the contents of /etc/daveapp-secret-key.txt
|
||||
return Key::loadFromAsciiSafeString($keyAscii);
|
||||
}
|
||||
```
|
||||
|
||||
Then, whenever Dave wants to save a secret value to the database, he will first
|
||||
encrypt it:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\Crypto;
|
||||
|
||||
// ...
|
||||
$key = loadEncryptionKeyFromConfig();
|
||||
// ...
|
||||
$ciphertext = Crypto::encrypt($secret_data, $key);
|
||||
// ... save $ciphertext into the database ...
|
||||
```
|
||||
|
||||
Whenever Dave wants to get the value back from the database, he must decrypt it
|
||||
using the same key:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\Crypto;
|
||||
|
||||
// ...
|
||||
$key = loadEncryptionKeyFromConfig();
|
||||
// ...
|
||||
$ciphertext = // ... load $ciphertext from the database
|
||||
try {
|
||||
$secret_data = Crypto::decrypt($ciphertext, $key);
|
||||
} catch (\Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException $ex) {
|
||||
// An attack! Either the wrong key was loaded, or the ciphertext has
|
||||
// changed since it was created -- either corrupted in the database or
|
||||
// intentionally modified by Eve trying to carry out an attack.
|
||||
|
||||
// ... handle this case in a way that's suitable to your application ...
|
||||
}
|
||||
```
|
||||
|
||||
Note that if anyone ever steals the key from Alice's server, they can decrypt
|
||||
all of the ciphertexts that are stored in the database. As part of our threat
|
||||
model, we are assuming Alice's server administration skills and Dave's secure
|
||||
coding skills are good enough to stop Eve from being able to steal the key.
|
||||
Under those assumptions, this solution will prevent Eve from seeing data that's
|
||||
stored in the database.
|
||||
|
||||
However, notice that our threat model says nothing about what could happen if
|
||||
Eve wants to *modify* the data. With this solution, Eve will not be able to
|
||||
alter any individual ciphertext (because each ciphertext has its own
|
||||
cryptographic integrity check), but Eve *will* be able to swap ciphertexts for
|
||||
one another, and revert ciphertexts to what they used to be at previous times.
|
||||
If we needed to defend against such attacks, we would have to re-design our
|
||||
threat model and come up with a different solution.
|
||||
|
||||
### Scenario #2: Encrypting account data with the user's login password
|
||||
|
||||
This scenario is like Scenario 1, but subtly different. The threat model is as
|
||||
follows. We have Alice, a server administrator, and Dave, the developer. Alice
|
||||
and Dave trust each other, and Alice wants to host Dave's web application,
|
||||
including its database, on her server. Alice is worried about her server getting
|
||||
hacked. The application will store the users' credit card numbers, and Alice
|
||||
wants to protect them in case the server gets hacked.
|
||||
|
||||
We can model the situation like this: after the server gets hacked, the attacker
|
||||
will have read and write access to all data on it until the attack is detected
|
||||
and Alice rebuilds the server. We'll call the time the attacker has access to
|
||||
the server the *exposure window.* One idea to minimize loss is to encrypt the
|
||||
users' credit card numbers using a key made from their login password. Then, as
|
||||
long as the users all have strong passwords, and they are never logged in during
|
||||
the exposure window, their credit cards will be protected from the attacker.
|
||||
|
||||
To implement this, Dave will use the `KeyProtectedByPassword` class. When a new
|
||||
user account is created, Dave will save a new key to their account, one that's
|
||||
protected by their login password:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\KeyProtectedByPassword;
|
||||
|
||||
function CreateUserAccount($username, $password)
|
||||
{
|
||||
// ... other user account creation stuff, including password hashing
|
||||
|
||||
$protected_key = KeyProtectedByPassword::createRandomPasswordProtectedKey($password);
|
||||
$protected_key_encoded = $protected_key->saveToAsciiSafeString();
|
||||
// ... save $protected_key_encoded into the user's account record
|
||||
}
|
||||
```
|
||||
|
||||
Then, when the user logs in, Dave's code will load the protected key from the
|
||||
user's account record, unlock it to get a `Key` object, and save the `Key`
|
||||
object somewhere safe (like temporary memory-backed session storage). Note that
|
||||
wherever Dave's code saves the key, it must be destroyed once the user logs out,
|
||||
or else the attacker might be able to find users' keys even if they were never
|
||||
logged in during the attack.
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\KeyProtectedByPassword;
|
||||
|
||||
// ... authenticate the user using a good password hashing scheme
|
||||
// keep the user's password in $password
|
||||
|
||||
$protected_key_encoded = // ... load it from the user's account record
|
||||
$protected_key = KeyProtectedByPassword::loadFromAsciiSafeString($protected_key_encoded);
|
||||
$user_key = $protected_key->unlockKey($password);
|
||||
$user_key_encoded = $user_key->saveToAsciiSafeString();
|
||||
// ... save $user_key_encoded in the session
|
||||
```
|
||||
|
||||
```php
|
||||
<?php
|
||||
// ... when the user is logging out ...
|
||||
// ... securely wipe the saved $user_key_encoded from the system ...
|
||||
```
|
||||
|
||||
When a user adds their credit card number, Dave's code will get the key from the
|
||||
session and use it to encrypt the credit card number:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\Crypto;
|
||||
use Defuse\Crypto\Key;
|
||||
|
||||
// ...
|
||||
|
||||
$user_key_encoded = // ... get it out of the session ...
|
||||
$user_key = Key::loadFromAsciiSafeString($user_key_encoded);
|
||||
|
||||
// ...
|
||||
|
||||
$credit_card_number = // ... get credit card number from the user
|
||||
$encrypted_card_number = Crypto::encrypt($credit_card_number, $user_key);
|
||||
// ... save $encrypted_card_number in the database
|
||||
```
|
||||
|
||||
When the application needs to use the credit card number, it will decrypt it:
|
||||
|
||||
```php
|
||||
<?php
|
||||
use Defuse\Crypto\Crypto;
|
||||
use Defuse\Crypto\Key;
|
||||
|
||||
// ...
|
||||
|
||||
$user_key_encoded = // ... get it out of the session
|
||||
$user_key = Key::loadFromAsciiSafeString($user_key_encoded);
|
||||
|
||||
// ...
|
||||
|
||||
$encrypted_card_number = // ... load it from the database ...
|
||||
try {
|
||||
$credit_card_number = Crypto::decrypt($encrypted_card_number, $user_key);
|
||||
} catch (Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException $ex) {
|
||||
// Either there's a bug in our code, we're trying to decrypt with the
|
||||
// wrong key, or the encrypted credit card number was corrupted in the
|
||||
// database.
|
||||
|
||||
// ... handle this case ...
|
||||
}
|
||||
```
|
||||
|
||||
With all caveats carefully heeded, this solution limits credit card number
|
||||
exposure in the case where Alice's server gets hacked for a short amount of
|
||||
time. Remember to think about the attacks that *aren't* included in our threat
|
||||
model. The attacker is still free to do all sorts of harmful things like
|
||||
modifying the server's data which may go undetected if Alice doesn't have secure
|
||||
backups to compare against.
|
||||
|
||||
Getting Help
|
||||
-------------
|
||||
|
||||
If you're having difficulty using the library, see if your problem is already
|
||||
solved by an answer in the [FAQ](FAQ.md).
|
51
vendor/defuse/php-encryption/docs/UpgradingFromV1.2.md
vendored
Normal file
51
vendor/defuse/php-encryption/docs/UpgradingFromV1.2.md
vendored
Normal file
|
@ -0,0 +1,51 @@
|
|||
Upgrading From Version 1.2
|
||||
===========================
|
||||
|
||||
With version 2.0.0 of this library came major changes to the ciphertext format,
|
||||
algorithms used for encryption, and API.
|
||||
|
||||
In version 1.2, keys were represented by 16-byte string variables. In version
|
||||
2.0.0, keys are represented by objects, instances of the `Key` class. This
|
||||
change was made in order to make it harder to misuse the API. For example, in
|
||||
version 1.2, you could pass in *any* 16-byte string, but in version 2.0.0 you
|
||||
need a `Key` object, which you can only get if you're "doing the right thing."
|
||||
|
||||
This means that for all of your old version 1.2 keys, you'll have to:
|
||||
|
||||
1. Generate a new version 2.0.0 key.
|
||||
2. For all of the ciphertexts encrypted under the old key:
|
||||
1. Decrypt the ciphertext using the old version 1.2 key.
|
||||
2. Re-encrypt it using the new version 2.0.0 key.
|
||||
|
||||
Use the special `Crypto::legacyDecrypt()` method to decrypt the old ciphertexts
|
||||
using the old key and then re-encrypt them using `Crypto::encrypt()` with the
|
||||
new key. Your code will look something like the following. To avoid data loss,
|
||||
securely back up your keys and data before running your upgrade code.
|
||||
|
||||
```php
|
||||
<?php
|
||||
|
||||
// ...
|
||||
|
||||
$legacy_ciphertext = // ... get the ciphertext you want to upgrade ...
|
||||
$legacy_key = // ... get the key to decrypt this ciphertext ...
|
||||
|
||||
// Generate the new key that we'll re-encrypt the ciphertext with.
|
||||
$new_key = Key::createNewRandomKey();
|
||||
// ... save it somewhere ...
|
||||
|
||||
// Decrypt it.
|
||||
try {
|
||||
$plaintext = Crypto::legacyDecrypt($legacy_ciphertext, $legacy_key);
|
||||
} catch (Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException $ex)
|
||||
{
|
||||
// ... TODO: handle this case appropriately ...
|
||||
}
|
||||
|
||||
// Re-encrypt it.
|
||||
$new_ciphertext = Crypto::encrypt($plaintext, $new_key);
|
||||
|
||||
// ... replace the old $legacy_ciphertext with the new $new_ciphertext
|
||||
|
||||
// ...
|
||||
```
|
260
vendor/defuse/php-encryption/docs/classes/Crypto.md
vendored
Normal file
260
vendor/defuse/php-encryption/docs/classes/Crypto.md
vendored
Normal file
|
@ -0,0 +1,260 @@
|
|||
Class: Defuse\Crypto\Crypto
|
||||
============================
|
||||
|
||||
The `Crypto` class provides encryption and decryption of strings either using
|
||||
a secret key or secret password. For encryption and decryption of large files,
|
||||
see the `File` class.
|
||||
|
||||
This code for this class is in `src/Crypto.php`.
|
||||
|
||||
Instance Methods
|
||||
-----------------
|
||||
|
||||
This class has no instance methods.
|
||||
|
||||
Static Methods
|
||||
---------------
|
||||
|
||||
### Crypto::encrypt($plaintext, Key $key, $raw\_binary = false)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a plaintext string using a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$plaintext` is the string to encrypt.
|
||||
2. `$key` is an instance of `Key` containing the secret key for encryption.
|
||||
3. `$raw_binary` determines whether the output will be a byte string (true) or
|
||||
hex encoded (false, the default).
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns a ciphertext string representing `$plaintext` encrypted with the key
|
||||
`$key`. Knowledge of `$key` is required in order to decrypt the ciphertext and
|
||||
recover the plaintext.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time one of the `Crypto` methods has been called. The performance overhead is
|
||||
negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
The ciphertext returned by this method is decryptable by anyone with knowledge
|
||||
of the key `$key`. It is the caller's responsibility to keep `$key` secret.
|
||||
Where `$key` should be stored is up to the caller and depends on the threat
|
||||
model the caller is designing their application under. If you are unsure where
|
||||
to store `$key`, consult with a professional cryptographer to get help designing
|
||||
your application.
|
||||
|
||||
### Crypto::decrypt($ciphertext, Key $key, $raw\_binary = false)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a ciphertext string using a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$ciphertext` is the ciphertext to be decrypted.
|
||||
2. `$key` is an instance of `Key` containing the secret key for decryption.
|
||||
3. `$raw_binary` must have the same value as the `$raw_binary` given to the
|
||||
call to `encrypt()` that generated `$ciphertext`.
|
||||
|
||||
**Return value:**
|
||||
|
||||
If the decryption succeeds, returns a string containing the same value as the
|
||||
string that was passed to `encrypt()` when `$ciphertext` was produced. Upon
|
||||
a successful return, the caller can be assured that `$ciphertext` could not have
|
||||
been produced except by someone with knowledge of `$key`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$key` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time one of the `Crypto` methods has been called. The performance overhead is
|
||||
negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong key and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
||||
### Crypto::encryptWithPassword($plaintext, $password, $raw\_binary = false)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a plaintext string using a secret password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$plaintext` is the string to encrypt.
|
||||
2. `$password` is a string containing the secret password used for encryption.
|
||||
3. `$raw_binary` determines whether the output will be a byte string (true) or
|
||||
hex encoded (false, the default).
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns a ciphertext string representing `$plaintext` encrypted with a key
|
||||
derived from `$password`. Knowledge of `$password` is required in order to
|
||||
decrypt the ciphertext and recover the plaintext.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method is intentionally slow, using a lot of CPU resources for a fraction
|
||||
of a second. It applies key stretching to the password in order to make password
|
||||
guessing attacks more computationally expensive. If you need a faster way to
|
||||
encrypt multiple ciphertexts under the same password, see the
|
||||
`KeyProtectedByPassword` class.
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time one of the `Crypto` methods has been called. The performance overhead is
|
||||
negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
### Crypto::decryptWithPassword($ciphertext, $password, $raw\_binary = false)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a ciphertext string using a secret password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$ciphertext` is the ciphertext to be decrypted.
|
||||
2. `$password` is a string containing the secret password used for decryption.
|
||||
3. `$raw_binary` must have the same value as the `$raw_binary` given to the
|
||||
call to `encryptWithPassword()` that generated `$ciphertext`.
|
||||
|
||||
**Return value:**
|
||||
|
||||
If the decryption succeeds, returns a string containing the same value as the
|
||||
string that was passed to `encryptWithPassword()` when `$ciphertext` was
|
||||
produced. Upon a successful return, the caller can be assured that `$ciphertext`
|
||||
could not have been produced except by someone with knowledge of `$password`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$password` is not the correct password for the given ciphertext, or if
|
||||
the ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects:**
|
||||
|
||||
This method is intentionally slow. It applies key stretching to the password in
|
||||
order to make password guessing attacks more computationally expensive. If you
|
||||
need a faster way to encrypt multiple ciphertexts under the same password, see
|
||||
the `KeyProtectedByPassword` class.
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time one of the `Crypto` methods has been called. The performance overhead is
|
||||
negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong password and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
||||
### Crypto::legacyDecrypt($ciphertext, $key)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a ciphertext produced by version 1 of this library so that the
|
||||
plaintext can be re-encrypted into a version 2 ciphertext. See [Upgrading from
|
||||
v1.2](../UpgradingFromV1.2.md).
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$ciphertext` is a ciphertext produced by version 1.x of this library.
|
||||
2. `$key` is a 16-byte string (*not* a Key object) containing the key that was
|
||||
used with version 1.x of this library to produce `$ciphertext`.
|
||||
|
||||
**Return value:**
|
||||
|
||||
If the decryption succeeds, returns the string that was encrypted to make
|
||||
`$ciphertext` by version 1.x of this library. Upon a successful return, the
|
||||
caller can be assured that `$ciphertext` could not have been produced except by
|
||||
someone with knowledge of `$key`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$key` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects:**
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time one of the `Crypto` methods has been called. The performance overhead is
|
||||
negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$key` may be leaked out to an attacker through the stack trace. We
|
||||
recommend configuring PHP to never output stack traces (either displaying them
|
||||
to the user or saving them to log files).
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong key and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
446
vendor/defuse/php-encryption/docs/classes/File.md
vendored
Normal file
446
vendor/defuse/php-encryption/docs/classes/File.md
vendored
Normal file
|
@ -0,0 +1,446 @@
|
|||
Class: Defuse\Crypto\File
|
||||
==========================
|
||||
|
||||
Instance Methods
|
||||
-----------------
|
||||
|
||||
This class has no instance methods.
|
||||
|
||||
Static Methods
|
||||
---------------
|
||||
|
||||
### File::encryptFile($inputFilename, $outputFilename, Key $key)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a file using a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputFilename` is the path to a file containing the plaintext to encrypt.
|
||||
2. `$outputFilename` is the path to save the ciphertext file.
|
||||
3. `$key` is an instance of `Key` containing the secret key for encryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Encrypts the contents of the input file, writing the result to the output file.
|
||||
If the output file already exists, it is overwritten.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
The ciphertext output by this method is decryptable by anyone with knowledge of
|
||||
the key `$key`. It is the caller's responsibility to keep `$key` secret. Where
|
||||
`$key` should be stored is up to the caller and depends on the threat model the
|
||||
caller is designing their application under. If you are unsure where to store
|
||||
`$key`, consult with a professional cryptographer to get help designing your
|
||||
application.
|
||||
|
||||
### File::decryptFile($inputFilename, $outputFilename, Key $key)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a file using a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputFilename` is the path to a file containing the ciphertext to decrypt.
|
||||
2. `$outputFilename` is the path to save the decrypted plaintext file.
|
||||
3. `$key` is an instance of `Key` containing the secret key for decryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Decrypts the contents of the input file, writing the result to the output file.
|
||||
If the output file already exists, it is overwritten.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$key` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
The input ciphertext is processed in two passes. The first pass verifies the
|
||||
integrity and the second pass performs the actual decryption of the file and
|
||||
writing to the output file. This is done in a streaming manner so that only
|
||||
a small part of the file is ever loaded into memory at a time.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
Be aware that when `Defuse\Crypto\WrongKeyOrModifiedCiphertextException` is
|
||||
thrown, some partial plaintext data may have been written to the output. Any
|
||||
plaintext data that is output is guaranteed to be a prefix of the original
|
||||
plaintext (i.e. at worst it was truncated). This can only happen if an attacker
|
||||
modifies the input between the first pass (integrity check) and the second pass
|
||||
(decryption) over the file.
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong key and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
||||
### File::encryptFileWithPassword($inputFilename, $outputFilename, $password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a file with a password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputFilename` is the path to a file containing the plaintext to encrypt.
|
||||
2. `$outputFilename` is the path to save the ciphertext file.
|
||||
3. `$password` is the password used for decryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Encrypts the contents of the input file, writing the result to the output file.
|
||||
If the output file already exists, it is overwritten.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method is intentionally slow, using a lot of CPU resources for a fraction
|
||||
of a second. It applies key stretching to the password in order to make password
|
||||
guessing attacks more computationally expensive. If you need a faster way to
|
||||
encrypt multiple ciphertexts under the same password, see the
|
||||
`KeyProtectedByPassword` class.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
### File::decryptFileWithPassword($inputFilename, $outputFilename, $password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a file with a password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputFilename` is the path to a file containing the ciphertext to decrypt.
|
||||
2. `$outputFilename` is the path to save the decrypted plaintext file.
|
||||
3. `$password` is the password used for decryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Decrypts the contents of the input file, writing the result to the output file.
|
||||
If the output file already exists, it is overwritten.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$password` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method is intentionally slow, using a lot of CPU resources for a fraction
|
||||
of a second. It applies key stretching to the password in order to make password
|
||||
guessing attacks more computationally expensive. If you need a faster way to
|
||||
encrypt multiple ciphertexts under the same password, see the
|
||||
`KeyProtectedByPassword` class.
|
||||
|
||||
The input ciphertext is processed in two passes. The first pass verifies the
|
||||
integrity and the second pass performs the actual decryption of the file and
|
||||
writing to the output file. This is done in a streaming manner so that only
|
||||
a small part of the file is ever loaded into memory at a time.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
Be aware that when `Defuse\Crypto\WrongKeyOrModifiedCiphertextException` is
|
||||
thrown, some partial plaintext data may have been written to the output. Any
|
||||
plaintext data that is output is guaranteed to be a prefix of the original
|
||||
plaintext (i.e. at worst it was truncated). This can only happen if an attacker
|
||||
modifies the input between the first pass (integrity check) and the second pass
|
||||
(decryption) over the file.
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong password and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
||||
### File::encryptResource($inputHandle, $outputHandle, Key $key)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a resource (stream) with a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputHandle` is a handle to a resource (like a file pointer) containing the
|
||||
plaintext to encrypt.
|
||||
2. `$outputHandle` is a handle to a resource (like a file pointer) that the
|
||||
ciphertext will be written to.
|
||||
3. `$key` is an instance of `Key` containing the secret key for encryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Encrypts the data read from the input stream and writes it to the output stream.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
The ciphertext output by this method is decryptable by anyone with knowledge of
|
||||
the key `$key`. It is the caller's responsibility to keep `$key` secret. Where
|
||||
`$key` should be stored is up to the caller and depends on the threat model the
|
||||
caller is designing their application under. If you are unsure where to store
|
||||
`$key`, consult with a professional cryptographer to get help designing your
|
||||
application.
|
||||
|
||||
### File::decryptResource($inputHandle, $outputHandle, Key $key)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a resource (stream) with a secret key.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputHandle` is a handle to a file-backed resource containing the
|
||||
ciphertext to decrypt. It must be a file not a network stream or standard
|
||||
input.
|
||||
2. `$outputHandle` is a handle to a resource (like a file pointer) that the
|
||||
plaintext will be written to.
|
||||
3. `$key` is an instance of `Key` containing the secret key for decryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Decrypts the data read from the input stream and writes it to the output stream.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$key` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
The input ciphertext is processed in two passes. The first pass verifies the
|
||||
integrity and the second pass performs the actual decryption of the file and
|
||||
writing to the output file. This is done in a streaming manner so that only
|
||||
a small part of the file is ever loaded into memory at a time.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
Be aware that when `Defuse\Crypto\WrongKeyOrModifiedCiphertextException` is
|
||||
thrown, some partial plaintext data may have been written to the output. Any
|
||||
plaintext data that is output is guaranteed to be a prefix of the original
|
||||
plaintext (i.e. at worst it was truncated). This can only happen if an attacker
|
||||
modifies the input between the first pass (integrity check) and the second pass
|
||||
(decryption) over the file.
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong key and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
||||
|
||||
### File::encryptResourceWithPassword($inputHandle, $outputHandle, $password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Encrypts a resource (stream) with a password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputHandle` is a handle to a resource (like a file pointer) containing the
|
||||
plaintext to encrypt.
|
||||
2. `$outputHandle` is a handle to a resource (like a file pointer) that the
|
||||
ciphertext will be written to.
|
||||
3. `$password` is the password used for encryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Encrypts the data read from the input stream and writes it to the output stream.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method is intentionally slow, using a lot of CPU resources for a fraction
|
||||
of a second. It applies key stretching to the password in order to make password
|
||||
guessing attacks more computationally expensive. If you need a faster way to
|
||||
encrypt multiple ciphertexts under the same password, see the
|
||||
`KeyProtectedByPassword` class.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
### File::decryptResourceWithPassword($inputHandle, $outputHandle, $password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Decrypts a resource (stream) with a password.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$inputHandle` is a handle to a file-backed resource containing the
|
||||
ciphertext to decrypt. It must be a file not a network stream or standard
|
||||
input.
|
||||
2. `$outputHandle` is a handle to a resource (like a file pointer) that the
|
||||
plaintext will be written to.
|
||||
3. `$password` is the password used for decryption.
|
||||
|
||||
**Behavior:**
|
||||
|
||||
Decrypts the data read from the input stream and writes it to the output stream.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Does not return a value.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\IOException` is thrown if there is an I/O error.
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
the `$password` is not the correct key for the given ciphertext, or if the
|
||||
ciphertext has been modified (possibly maliciously). There is no way to
|
||||
distinguish between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method is intentionally slow, using a lot of CPU resources for a fraction
|
||||
of a second. It applies key stretching to the password in order to make password
|
||||
guessing attacks more computationally expensive. If you need a faster way to
|
||||
encrypt multiple ciphertexts under the same password, see the
|
||||
`KeyProtectedByPassword` class.
|
||||
|
||||
The input ciphertext is processed in two passes. The first pass verifies the
|
||||
integrity and the second pass performs the actual decryption of the file and
|
||||
writing to the output file. This is done in a streaming manner so that only
|
||||
a small part of the file is ever loaded into memory at a time.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
Be aware that when `Defuse\Crypto\WrongKeyOrModifiedCiphertextException` is
|
||||
thrown, some partial plaintext data may have been written to the output. Any
|
||||
plaintext data that is output is guaranteed to be a prefix of the original
|
||||
plaintext (i.e. at worst it was truncated). This can only happen if an attacker
|
||||
modifies the input between the first pass (integrity check) and the second pass
|
||||
(decryption) over the file.
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to decrypt with the wrong password and the case where you attempt to decrypt
|
||||
a modified (corrupted) ciphertext. It is up to the caller how to best deal with
|
||||
this ambiguity, as it depends on the application this library is being used in.
|
||||
If in doubt, consult with a professional cryptographer.
|
117
vendor/defuse/php-encryption/docs/classes/Key.md
vendored
Normal file
117
vendor/defuse/php-encryption/docs/classes/Key.md
vendored
Normal file
|
@ -0,0 +1,117 @@
|
|||
Class: Defuse\Crypto\Key
|
||||
=========================
|
||||
|
||||
The `Key` class represents a secret key used for encrypting and decrypting. Once
|
||||
you have a `Key` instance, you can use it with the `Crypto` class to encrypt and
|
||||
decrypt strings and with the `File` class to encrypt and decrypt files.
|
||||
|
||||
Instance Methods
|
||||
-----------------
|
||||
|
||||
### saveToAsciiSafeString()
|
||||
|
||||
**Description:**
|
||||
|
||||
Saves the encryption key to a string of printable ASCII characters, which can be
|
||||
loaded again into a `Key` instance using `Key::loadFromAsciiSafeString()`.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
This method does not take any parameters.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns a string of printable ASCII characters representing this `Key` instance,
|
||||
which can be loaded back into an instance of `Key` using
|
||||
`Key::loadFromAsciiSafeString()`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
This method currently returns a hexadecimal string. You should not rely on this
|
||||
behavior. For example, it may be improved in the future to return a base64
|
||||
string.
|
||||
|
||||
Static Methods
|
||||
---------------
|
||||
|
||||
### Key::createNewRandomKey()
|
||||
|
||||
**Description:**
|
||||
|
||||
Generates a new random key and returns an instance of `Key`.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
This method does not take any parameters.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns an instance of `Key` containing a randomly-generated encryption key.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
None.
|
||||
|
||||
### Key::loadFromAsciiSafeString($saved\_key\_string, $do\_not\_trim = false)
|
||||
|
||||
**Description:**
|
||||
|
||||
Loads an instance of `Key` that was saved to a string by
|
||||
`saveToAsciiSafeString()`.
|
||||
|
||||
By default, this function will call `Encoding::trimTrailingWhitespace()`
|
||||
to remove trailing CR, LF, NUL, TAB, and SPACE characters, which are commonly
|
||||
appended to files when working with text editors.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$saved_key_string` is the string returned from `saveToAsciiSafeString()`
|
||||
when the original `Key` instance was saved.
|
||||
2. `$do_not_trim` should be set to `TRUE` if you do not wish for the library
|
||||
to automatically strip trailing whitespace from the string.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns an instance of `Key` representing the same encryption key as the one
|
||||
that was represented by the `Key` instance that got saved into
|
||||
`$saved_key_string` by a call to `saveToAsciiSafeString()`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\BadFormatException` is thrown whenever
|
||||
`$saved_key_string` does not represent a valid `Key` instance.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
None.
|
191
vendor/defuse/php-encryption/docs/classes/KeyProtectedByPassword.md
vendored
Normal file
191
vendor/defuse/php-encryption/docs/classes/KeyProtectedByPassword.md
vendored
Normal file
|
@ -0,0 +1,191 @@
|
|||
Class: Defuse\Crypto\KeyProtectedByPassword
|
||||
============================================
|
||||
|
||||
The `KeyProtectedByPassword` class represents a key that is "locked" with
|
||||
a password. In order to obtain an instance of `Key` that you can use for
|
||||
encrypting and decrypting, a `KeyProtectedByPassword` must first be "unlocked"
|
||||
by providing the correct password.
|
||||
|
||||
`KeyProtectedByPassword` provides an alternative to using the
|
||||
`encryptWithPassword()`, `decryptWithPassword()`, `encryptFileWithPassword()`,
|
||||
and `decryptFileWithPassword()` methods with several advantages:
|
||||
|
||||
- The slow and computationally-expensive key stretching is run only once when
|
||||
you unlock a `KeyProtectedByPassword` to obtain the `Key`.
|
||||
- You do not have to keep the original password in memory to encrypt and decrypt
|
||||
things. After you've obtained the `Key` from a `KeyProtectedByPassword`, the
|
||||
password is no longer necessary.
|
||||
|
||||
Instance Methods
|
||||
-----------------
|
||||
|
||||
### saveToAsciiSafeString()
|
||||
|
||||
**Description:**
|
||||
|
||||
Saves the protected key to a string of printable ASCII characters, which can be
|
||||
loaded again into a `KeyProtectedByPassword` instance using
|
||||
`KeyProtectedByPassword::loadFromAsciiSafeString()`.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
This method does not take any parameters.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns a string of printable ASCII characters representing this
|
||||
`KeyProtectedByPassword` instance, which can be loaded back into an instance of
|
||||
`KeyProtectedByPassword` using
|
||||
`KeyProtectedByPassword::loadFromAsciiSafeString()`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
This method currently returns a hexadecimal string. You should not rely on this
|
||||
behavior. For example, it may be improved in the future to return a base64
|
||||
string.
|
||||
|
||||
### unlockKey($password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Unlocks the password-protected key, obtaining a `Key` which can be used for
|
||||
encryption and decryption.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$password` is the password required to unlock this `KeyProtectedByPassword`
|
||||
to obtain the `Key`.
|
||||
|
||||
**Return value:**
|
||||
|
||||
If `$password` is the correct password, then this method returns an instance of
|
||||
the `Key` class.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\WrongKeyOrModifiedCiphertextException` is thrown if
|
||||
either the given `$password` is not the correct password for this
|
||||
`KeyProtectedByPassword` or the ciphertext stored internally by this object
|
||||
has been modified, i.e. it was accidentally corrupted or intentionally
|
||||
corrupted by an attacker. There is no way for the caller to distinguish
|
||||
between these two cases.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time this method or one of the `Crypto` methods has been called. The performance
|
||||
overhead is negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
It is impossible in principle to distinguish between the case where you attempt
|
||||
to unlock with the wrong password and the case where you attempt to unlock
|
||||
a modified (corrupted) `KeyProtectedByPassword. It is up to the caller how to
|
||||
best deal with this ambiguity, as it depends on the application this library is
|
||||
being used in. If in doubt, consult with a professional cryptographer.
|
||||
|
||||
Static Methods
|
||||
---------------
|
||||
|
||||
### KeyProtectedByPassword::createRandomPasswordProtectedKey($password)
|
||||
|
||||
**Description:**
|
||||
|
||||
Generates a new random key that's protected by the string `$password` and
|
||||
returns an instance of `KeyProtectedByPassword`.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$password` is the password used to protect the random key.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns an instance of `KeyProtectedByPassword` containing a randomly-generated
|
||||
encryption key that's protected by the password `$password`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
This method runs a small and very fast set of self-tests if it is the very first
|
||||
time this method or one of the `Crypto` methods has been called. The performance
|
||||
overhead is negligible and can be safely ignored in all applications.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
PHP stack traces display (portions of) the arguments passed to methods on the
|
||||
call stack. If an exception is thrown inside this call, and it is uncaught, the
|
||||
value of `$password` may be leaked out to an attacker through the stack trace.
|
||||
We recommend configuring PHP to never output stack traces (either displaying
|
||||
them to the user or saving them to log files).
|
||||
|
||||
Be aware that if you protecting multiple keys with the same password, an
|
||||
attacker with write access to your system will be able to swap the protected
|
||||
keys around so that the wrong key gets used next time it is unlocked. This could
|
||||
lead to data being encrypted with the wrong key, perhaps one that the attacker
|
||||
knows.
|
||||
|
||||
### KeyProtectedByPassword::loadFromAsciiSafeString($saved\_key\_string)
|
||||
|
||||
**Description:**
|
||||
|
||||
Loads an instance of `KeyProtectedByPassword` that was saved to a string by
|
||||
`saveToAsciiSafeString()`.
|
||||
|
||||
**Parameters:**
|
||||
|
||||
1. `$saved_key_string` is the string returned from `saveToAsciiSafeString()`
|
||||
when the original `KeyProtectedByPassword` instance was saved.
|
||||
|
||||
**Return value:**
|
||||
|
||||
Returns an instance of `KeyProtectedByPassword` representing the same
|
||||
password-protected key as the one that was represented by the
|
||||
`KeyProtectedByPassword` instance that got saved into `$saved_key_string` by
|
||||
a call to `saveToAsciiSafeString()`.
|
||||
|
||||
**Exceptions:**
|
||||
|
||||
- `Defuse\Crypto\Exception\EnvironmentIsBrokenException` is thrown either when
|
||||
the platform the code is running on cannot safely perform encryption for some
|
||||
reason (e.g. it lacks a secure random number generator), or the runtime tests
|
||||
detected a bug in this library.
|
||||
|
||||
- `Defuse\Crypto\Exception\BadFormatException` is thrown whenever
|
||||
`$saved_key_string` does not represent a valid `KeyProtectedByPassword`
|
||||
instance.
|
||||
|
||||
**Side-effects and performance:**
|
||||
|
||||
None.
|
||||
|
||||
**Cautions:**
|
||||
|
||||
None.
|
Loading…
Add table
Add a link
Reference in a new issue