#data-structures #secret

secret-vault-value

Library provides a simple implementation of a secure and serializable type to store and control secret/sensitive values

13 releases

Uses new Rust 2021

new 0.3.6 Sep 18, 2022
0.3.5 Aug 20, 2022
0.3.0 Jul 31, 2022
0.2.5 Jul 25, 2022
0.1.1 Jul 21, 2022

#187 in Cryptography

Download history 129/week @ 2022-07-15 238/week @ 2022-07-22 142/week @ 2022-07-29 112/week @ 2022-08-05 157/week @ 2022-08-12 176/week @ 2022-08-19 56/week @ 2022-08-26 77/week @ 2022-09-02 426/week @ 2022-09-09 435/week @ 2022-09-16

1,033 downloads per month
Used in 5 crates (3 directly)

Apache-2.0

27KB
557 lines

Cargo tests and formatting security audit unsafe license

Secret value type

A simple implementation of a secure and serializable (serde and proto) type of any kind of secrets:

  • Automatically cleaning up its value after destruction in memory using zeroize;
  • Prevents leaking in logs and stack traces;
  • Stored as a byte array and suitable for binary secrets;
  • Introduces additional functions with predicates to control the exposed border; of exposed secret values and clean-ups: exposed_in_*.
  • Securely encoding/decoding from hex/base64 formats;

Working with the type:

use secret_vault_value::*;

// Creating from string
let secret_value: SecretValue = "test".into();

// Creating from vec
let secret_value: SecretValue = vec![4,2].into();

// Creating from BytesMut
let secret_value: SecretValue = bytes::BytesMut::from("test").into();

// Reading as string
let secret_value: &str = secret_value4.as_sensitive_str();

// Reading as bytes
let secret_value: &[u8] = secret_value.as_sensitive_bytes();

// Reading as hex string
let secret_value: Zeroizing<String> = secret_value.as_sensitive_hex_str();

// Reading as base64 string
let secret_value: Zeroizing<String> = secret_value.as_sensitive_base64_str();

// Controlling the exposed value with closures/lambdas
let your_result = secret_value.exposed_in_as_zstr(|secret_value|{
    todo!()
});

// Controlling the exposed value with async closures/lambdas
let your_result = secret_value.exposed_in_as_zstr_async(|secret_value| async {
    todo!()
}).await;

// Deserialize embedded string value from JSON and expose it as zeroizable structure:
#[derive(Deserialize, Zeroize)]
struct YourType {
    _some_field: String
}

let your_result_json: YourType = secret_value.expose_json_value_as::<YourType>().unwrap();

Quick start

Cargo.toml:

[dependencies]
secret-vault-type = { version = "0.3.<x>", features=["..."] }

See security consideration below about versioning.

Available optional features for secret value type:

  • serde for serde serialization support
  • prost for protobuf serialization support
  • bytes for bytes conversion support
  • hex for hex conversion support
  • base64 for base64 conversion support

Security considerations and risks

OSS

Open source code is created through voluntary collaboration of software developers. The original authors license the code so that anyone can see it, modify it, and distribute new versions of it. You should manage all OSS using the same procedures and tools that you use for commercial products. As always, train your employees on cyber security best practices that can help them securely use and manage software products. You should not solely rely on individuals, especially on the projects like this reading sensitive information.

Versioning

Please don't use broad version dependency management not to include a new version of dependency automatically without your auditing the changes.

Zeroing, protecting memory and encryption don't provide 100% safety

There are still allocations on the protocol layers, there is a session secret key available in memory, privileged users on OS still have broad access, etc. So don't consider this is a completely safe solution for all possible attacks. Mitigation some of the attacks is not possible without implementing additional support on hardware/OS level (such as Intel SGX project, for instance).

Licence

Apache Software License (ASL)

Author

Abdulla Abdurakhmanov

Dependencies

~0.4–1.2MB
~25K SLoC