paragonie/hidden-string
HiddenString provides a small PHP utility for handling sensitive strings more safely in memory. Extracted from ParagonIE Halite, it helps reduce accidental exposure via debugging/serialization by wrapping secret values in an object. Requires PHP 7+.
Installation
Add to your composer.json:
composer require paragonie/hidden-string
No configuration required—just autoload.
First Use Case Wrap sensitive strings (passwords, tokens, API keys) to prevent exposure in stack traces:
use ParagonIE\HiddenString\HiddenString;
$password = new HiddenString('s3cr3tP@ss');
Where to Look First
getString(), append(), etc.)Wrapping Sensitive Data
Replace raw strings with HiddenString in:
Auth::attempt()).Http::withToken()).DB::select() with bound params).// Before
$token = 'sk_live_123abc';
// After
$token = new HiddenString('sk_live_123abc');
Integration with Laravel
HiddenString in Form Requests:
public function rules() {
return ['password' => 'required|string'];
}
public function prepareForValidation() {
$this->merge([
'password' => new HiddenString($this->password)
]);
}
HiddenString to interfaces for type safety:
$this->app->bind(SensitiveString::class, function () {
return new HiddenString('default');
});
String Operations
Use HiddenString methods for safe manipulation:
$hidden = new HiddenString('prefix_');
$hidden->append('suffix'); // Returns new HiddenString('prefix_suffix')
$hidden->toString(); // Returns 'prefix_suffix' (unwrapped)
Database Interactions Avoid exposing secrets in logs/queries:
DB::table('users')->where('api_token', $hiddenToken)->update(['last_used' => now()]);
Double Wrapping
Wrapping an already-wrapped HiddenString throws RuntimeException. Validate first:
if (!$string instanceof HiddenString) {
$string = new HiddenString($string);
}
Serialization Caveats
HiddenString implements __toString() but not Serializable. Use getString() for serialization:
$serialized = serialize($hidden->getString());
JSON Encoding
json_encode() on HiddenString returns null. Use getString() explicitly:
json_encode(['token' => $hidden->getString()]);
Laravel Debugging
dd() or dump() will show [HiddenString] instead of raw values.APP_DEBUG=false in production to avoid accidental leaks.HiddenString in error contexts to verify masking:
throw new \RuntimeException('Failed with token: ' . $hiddenToken);
// Stack trace will show: "Failed with token: [HiddenString]"
HiddenString for assertions:
$this->assertInstanceOf(HiddenString::class, $sensitiveData);
Custom Masking
Override __toString() for custom output (e.g., [REDACTED]):
class CustomHiddenString extends HiddenString {
public function __toString() {
return '[REDACTED]';
}
}
Laravel Service Provider Add a macro to auto-wrap strings in logs:
\Log::macro('sensitive', function ($message, $context = []) {
array_walk($context, function (&$value) {
$value = $value instanceof HiddenString ? '[HIDDEN]' : $value;
});
return \Log::info($message, $context);
});
Environment Variables
Use with vlucas/phpdotenv to hide .env secrets:
$dotenv = Dotenv::createImmutable(__DIR__);
$dotenv->load();
$dbPassword = new HiddenString($_ENV['DB_PASSWORD']);
How can I help you explore Laravel packages today?