SlideShare a Scribd company logo
1 of 85
Download to read offline
Password Hashing:
The Right Way
Jeremy Kendall - Memphis PHP
January 28, 2014

Wednesday, January 29, 14
Wednesday, January 29, 14
I love to code

Wednesday, January 29, 14
I love to code
I’m terribly forgetful

Wednesday, January 29, 14
I love to code
I’m terribly forgetful
I take pictures

Wednesday, January 29, 14
I love to code
I’m terribly forgetful
I take pictures
I work at OpenSky

Wednesday, January 29, 14
I’m a Little Off My Game

Wednesday, January 29, 14
What Qualifies Me To Talk
About Security?

Wednesday, January 29, 14
Not Much

Wednesday, January 29, 14
Not Much
But that will work in our favor ...

Wednesday, January 29, 14
Cryptography is Hard

Wednesday, January 29, 14
Cryptography is Hard
Pro Tip: Leave it to the experts

Wednesday, January 29, 14
The Wrong Way
<?php
class SecurityFail
{
// Encrypt Passwords for Highest Level of Security.
static public function encrypt($pword)
{
return md5($pword);
}
}

http://csiphp.com/blog/2012/02/16/encrypt-passwords-for-highest-level-of-security/

Wednesday, January 29, 14
The Right Way

http://php.net/manual/en/ref.password.php
Wednesday, January 29, 14
The Awesomer Way

Wednesday, January 29, 14
Password Hashing Functions

Wednesday, January 29, 14
Password Hashing Functions
Pro Tip: Use password_compat for PHP 5.3.7+

Wednesday, January 29, 14
Password Hashing Functions
Pro Tip: Use password_compat for PHP 5.3.7+
Pro Tip: Use phpass for PHP <= 5.3.6

Wednesday, January 29, 14
password_hash

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣

Creates a new password hash

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Strong, one-way hashing algorithm
‣
Creates a new password hash

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Strong, one-way hashing algorithm
‣
Creates a new password hash

‣

PASSWORD_DEFAULT or PASSWORD_BCRYPT

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Strong, one-way hashing algorithm
‣
Creates a new password hash

‣

‣

PASSWORD_DEFAULT or PASSWORD_BCRYPT

Optional cost and salt

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣

Always use PASSWORD_DEFAULT

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Your DB’s password field should be varchar(255)
‣
Always use PASSWORD_DEFAULT

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Your DB’s password field should be varchar(255)
‣
Do not use your own salt
‣
Always use PASSWORD_DEFAULT

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
‣
Your DB’s password field should be varchar(255)
‣
Do not use your own salt
‣
Check for an appropriate cost using the example script
‣ in the manual
Always use PASSWORD_DEFAULT

http://www.php.net/manual/en/function.password-hash.php

Wednesday, January 29, 14
password_hash
$hash = password_hash('secret pass', PASSWORD_DEFAULT);
// or
$options = array('cost' => 12);
$hash = password_hash('secret pass', PASSWORD_DEFAULT, $options);

Wednesday, January 29, 14
password_verify

Wednesday, January 29, 14
password_verify
‣

Wednesday, January 29, 14

Verifies that a password matches a hash
password_verify
‣
Uh, yeah, that’s about it
‣

Verifies that a password matches a hash

Wednesday, January 29, 14
password_verify
$valid = password_verify($_POST['pass'], $hashFromDb);

Wednesday, January 29, 14
password_needs_rehash

Wednesday, January 29, 14
password_needs_rehash
‣

Wednesday, January 29, 14

Checks password to see if it needs to be updated
password_needs_rehash
‣
Uses both hash and cost to check current hash
‣

Checks password to see if it needs to be updated

Wednesday, January 29, 14
password_needs_rehash
$needsRehash = password_needs_rehash($hashFromDb, PASSWORD_DEFAULT);
// or
$options = array('cost' => 12);
$needsRehash = password_needs_rehash($hashFromDb, PASSWORD_DEFAULT, $options);

Wednesday, January 29, 14
That’s Awesome and Secure

Wednesday, January 29, 14
But Could It Be Awesomer,
Securer, and Easier?

Wednesday, January 29, 14
Password Validator

Wednesday, January 29, 14
Password Validator
‣

Wednesday, January 29, 14

Validates passwords against password_hash
Password Validator
‣
Will rehash when needed
‣

Validates passwords against password_hash

Wednesday, January 29, 14
Password Validator
‣
Will rehash when needed
‣
Will upgrade legacy passwords
‣

Validates passwords against password_hash

Wednesday, January 29, 14
Password Validator
‣
Will rehash when needed
‣
Will upgrade legacy passwords
‣
Requires PHP 5.3.7+
‣

Validates passwords against password_hash

Wednesday, January 29, 14
Password Validator
‣
Will rehash when needed
‣
Will upgrade legacy passwords
‣
Requires PHP 5.3.7+
‣
(No version for <=5.3.6 is in the works)
‣

Validates passwords against password_hash

Wednesday, January 29, 14
Password Validator
use JeremyKendallPasswordPasswordValidator;
use JeremyKendallPasswordResult as ValidationResult;
$passwordHash = password_hash('password', PASSWORD_DEFAULT);
$validator = new PasswordValidator();
$result = $validator->isValid('password', $passwordHash);
$valid = $result->isValid();
$code = $result->getCode();
// $valid = true
// $code = ValidationResult::SUCCESS

Wednesday, January 29, 14
Password Validator
use JeremyKendallPasswordPasswordValidator;

use JeremyKendallPasswordResult as ValidationResult;
$options = array('cost' => 9);
$passwordHash = password_hash('password', PASSWORD_DEFAULT, $options);
$validator = new PasswordValidator();
$validator->setOptions($options);
$result = $validator->isValid('password', $passwordHash);

$valid = $result->isValid();
$code = $result->getCode();
// $valid = true
// $code = ValidationResult::SUCCESS

Wednesday, January 29, 14
Password Validator
use JeremyKendallPasswordPasswordValidator;

use JeremyKendallPasswordResult as ValidationResult;
$options = array('cost' => 9);
$passwordHash = password_hash('password', PASSWORD_DEFAULT, $options);
$validator = new PasswordValidator();
// Remember, default cost is 10, so a cost 9 hash gets rehashed
$result = $validator->isValid('password', $passwordHash);

$valid = $result->isValid();
$code = $result->getCode();
$hash = $result->getPassword();
// $valid = true
// $code = ValidationResult::SUCCESS_PASSWORD_REHASHED
// $hash = the new, rehashed password. Save it!

Wednesday, January 29, 14
Fine, But We’re Not Using
password_hash Yet ...

Wednesday, January 29, 14
Decorator Pattern

http://en.wikipedia.org/wiki/Decorator_pattern

Wednesday, January 29, 14
Decorator Pattern
‣

Wrap an object

http://en.wikipedia.org/wiki/Decorator_pattern

Wednesday, January 29, 14
Decorator Pattern
‣
Change its behavior
‣
Wrap an object

http://en.wikipedia.org/wiki/Decorator_pattern

Wednesday, January 29, 14
Decorator Pattern
‣
Change its behavior
‣
Dynamically attach additional responsibilities
‣
Wrap an object

http://en.wikipedia.org/wiki/Decorator_pattern

Wednesday, January 29, 14
PasswordValidatorInterface
interface PasswordValidatorInterface
{
public function isValid($password, $passwordHash, $identity = null);
public function rehash($password);
public function setOptions(array $options);
public function getOptions();
}

Wednesday, January 29, 14
Upgrade Decorator

Wednesday, January 29, 14
Upgrade Decorator
‣

Wednesday, January 29, 14

Used when you’re not already using password_hash ...
Upgrade Decorator
‣
... but you’re ready to do things the right way
‣

Used when you’re not already using password_hash ...

Wednesday, January 29, 14
Upgrade Decorator
‣
... but you’re ready to do things the right way
‣
Accepts an instance of PasswordValidatorInterface ...
‣

Used when you’re not already using password_hash ...

Wednesday, January 29, 14
Upgrade Decorator
‣
... but you’re ready to do things the right way
‣
Accepts an instance of PasswordValidatorInterface ...
‣
... and a validation callback
‣

Used when you’re not already using password_hash ...

Wednesday, January 29, 14
Upgrade Decorator
// Somewhere in your authentication script
if (hash('sha512', $password) === $passwordHash) {
$valid = true;
}
$valid = false;

Wednesday, January 29, 14
Upgrade Decorator
// Same authentication check expressed as a callback
$validationCallback = function ($password, $passwordHash) {
if (hash('sha512', $password) === $passwordHash) {
return true;
}
return false;
};

Wednesday, January 29, 14
Upgrade Decorator
$validator = new UpgradeDecorator(
new PasswordValidator(),
$validationCallback
);
$passwordHash = hash('sha512', 'password');
$result = $validator->isValid('password', $passwordHash);
$valid = $result->isValid();
$code = $result->getCode();
$hash = $result->getPassword();
// $valid = true
// $code = ValidationResult::SUCCESS_PASSWORD_REHASHED
// $hash = the new, rehashed password. Save it!

Wednesday, January 29, 14
Fine, But Now I Have to Test
for SUCCESS_PASSWORD_REHASHED
Every Time

Wednesday, January 29, 14
Storage Decorator

Wednesday, January 29, 14
Storage Decorator
‣

Wednesday, January 29, 14

Automatically stores all rehashed passwords
Storage Decorator
‣
Accepts two constructor args:
‣

Automatically stores all rehashed passwords

Wednesday, January 29, 14
Storage Decorator
‣
Accepts two constructor args:
‣
Instance of PasswordValidatorInterface
‣

Automatically stores all rehashed passwords

Wednesday, January 29, 14
Storage Decorator
‣
Accepts two constructor args:
‣
Instance of PasswordValidatorInterface
‣
Instance of StorageInterface
‣

Automatically stores all rehashed passwords

Wednesday, January 29, 14
StorageInterface
interface StorageInterface
{
/**
* Updates user's password in persistent storage
*
* @param string $identity Unique user identifier
* @param string $password New password hash
*/
public function updatePassword($identity, $password);
}

Wednesday, January 29, 14
UserDao
use JeremyKendallPasswordStorageStorageInterface;
class UserDao implements StorageInterface
{
protected $db;
public function __construct(PDO $db)
{
$this->db = $db;
}
public function updatePassword($identity, $newPasswordHash)
{
$sql = 'UPDATE users SET passwordHash = :passwordHash WHERE identity = :identity';
$stmt = $this->db->prepare($sql);
$stmt->execute(array('passwordHash' => $newPasswordHash, 'identity' => $identity));
return $this->find($identity);
}
}

Wednesday, January 29, 14
Storage Decorator
use JeremyKendallPasswordDecoratorStorageDecorator;
$validator = new StorageDecorator($upgradeDecorator, $userDao);
// Uses the optional third argument for PasswordValidatorInterface::isValid()
$result = $validator->isValid('password', $passwordHash, 'arthur@arthurdent.com');
// Result is the same as any other validation attempt except ...
// ... ValidationResult::SUCCESS_PASSWORD_REHASHED hashes are automatically persisted!

Wednesday, January 29, 14
Recap

Wednesday, January 29, 14
Recap
‣

Wednesday, January 29, 14

Use the new PHP password hashing functions
Recap
‣
Use Password Validator to make it dead simple
‣
Use the new PHP password hashing functions

Wednesday, January 29, 14
Recap
‣
Use Password Validator to make it dead simple
‣
If you’re not at PHP 5.5, use password_compat
‣
Use the new PHP password hashing functions

Wednesday, January 29, 14
Recap
‣
Use Password Validator to make it dead simple
‣
If you’re not at PHP 5.5, use password_compat
‣
If you’re not at PHP 5.3.7+, UPGRADE
‣
Use the new PHP password hashing functions

Wednesday, January 29, 14
Recap
‣
Use Password Validator to make it dead simple
‣
If you’re not at PHP 5.5, use password_compat
‣
If you’re not at PHP 5.3.7+, UPGRADE
‣
If you can’t upgrade, use OpenWall’s phpass
‣
Use the new PHP password hashing functions

Wednesday, January 29, 14
Recap
‣
Use Password Validator to make it dead simple
‣
If you’re not at PHP 5.5, use password_compat
‣
If you’re not at PHP 5.3.7+, UPGRADE
‣
If you can’t upgrade, use OpenWall’s phpass
‣
DO NOT ROLL YOUR OWN
‣
Use the new PHP password hashing functions

Wednesday, January 29, 14
Resources

Wednesday, January 29, 14
Resources
‣

Wednesday, January 29, 14

PHP Password Hashing Functions: http://php.net/password
Resources
‣
Original password_hash RFC:
‣

PHP Password Hashing Functions: http://php.net/password

Wednesday, January 29, 14

https://wiki.php.net/rfc/password_hash
Resources
‣
Original password_hash RFC:
‣
Password Validator:
‣

PHP Password Hashing Functions: http://php.net/password
https://wiki.php.net/rfc/password_hash

https://github.com/jeremykendall/password-validator

Wednesday, January 29, 14
Resources
‣
Original password_hash RFC:
‣
Password Validator:
‣
password_compat:
‣

PHP Password Hashing Functions: http://php.net/password
https://wiki.php.net/rfc/password_hash

https://github.com/jeremykendall/password-validator

https://github.com/ircmaxell/password_compat

Wednesday, January 29, 14
Resources
‣
Original password_hash RFC:
‣
Password Validator:
‣
password_compat:
‣
OpenWall phpass:
‣

PHP Password Hashing Functions: http://php.net/password
https://wiki.php.net/rfc/password_hash

https://github.com/jeremykendall/password-validator

https://github.com/ircmaxell/password_compat

http://www.openwall.com/phpass/

Wednesday, January 29, 14
Thanks!
jeremy@jeremykendall.net
http://about.me/jeremykendall
@jeremykendall
http://365.jeremykendall.net

Wednesday, January 29, 14

More Related Content

More from Jeremy Kendall

Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPJeremy Kendall
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPJeremy Kendall
 
5 Ways to Awesome-ize Your (PHP) Code
5 Ways to Awesome-ize Your (PHP) Code5 Ways to Awesome-ize Your (PHP) Code
5 Ways to Awesome-ize Your (PHP) CodeJeremy Kendall
 
Game Changing Dependency Management
Game Changing Dependency ManagementGame Changing Dependency Management
Game Changing Dependency ManagementJeremy Kendall
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodJeremy Kendall
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkJeremy Kendall
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkJeremy Kendall
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkJeremy Kendall
 
PHP 102: Out with the Bad, In with the Good
PHP 102: Out with the Bad, In with the GoodPHP 102: Out with the Bad, In with the Good
PHP 102: Out with the Bad, In with the GoodJeremy Kendall
 
Intro to #memtech PHP 2011-12-05
Intro to #memtech PHP   2011-12-05Intro to #memtech PHP   2011-12-05
Intro to #memtech PHP 2011-12-05Jeremy Kendall
 
TDD in PHP - Memphis PHP 2011-08-25
TDD in PHP - Memphis PHP 2011-08-25TDD in PHP - Memphis PHP 2011-08-25
TDD in PHP - Memphis PHP 2011-08-25Jeremy Kendall
 
Zend_Form to the Rescue - A Brief Introduction to Zend_Form
Zend_Form to the Rescue - A Brief Introduction to Zend_FormZend_Form to the Rescue - A Brief Introduction to Zend_Form
Zend_Form to the Rescue - A Brief Introduction to Zend_FormJeremy Kendall
 
Zero to ZF in 10 Minutes
Zero to ZF in 10 MinutesZero to ZF in 10 Minutes
Zero to ZF in 10 MinutesJeremy Kendall
 
Tdd in php a brief example
Tdd in php   a brief exampleTdd in php   a brief example
Tdd in php a brief exampleJeremy Kendall
 
A Brief Introduction to Zend_Form
A Brief Introduction to Zend_FormA Brief Introduction to Zend_Form
A Brief Introduction to Zend_FormJeremy Kendall
 
Zero to Zend Framework in 10 minutes
Zero to Zend Framework in 10 minutesZero to Zend Framework in 10 minutes
Zero to Zend Framework in 10 minutesJeremy Kendall
 

More from Jeremy Kendall (17)

Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
Leveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHPLeveraging the Power of Graph Databases in PHP
Leveraging the Power of Graph Databases in PHP
 
5 Ways to Awesome-ize Your (PHP) Code
5 Ways to Awesome-ize Your (PHP) Code5 Ways to Awesome-ize Your (PHP) Code
5 Ways to Awesome-ize Your (PHP) Code
 
Game Changing Dependency Management
Game Changing Dependency ManagementGame Changing Dependency Management
Game Changing Dependency Management
 
Php 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the GoodPhp 102: Out with the Bad, In with the Good
Php 102: Out with the Bad, In with the Good
 
Keeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro frameworkKeeping it small - Getting to know the Slim PHP micro framework
Keeping it small - Getting to know the Slim PHP micro framework
 
Keeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro FrameworkKeeping it Small: Getting to know the Slim Micro Framework
Keeping it Small: Getting to know the Slim Micro Framework
 
Keeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro frameworkKeeping it small: Getting to know the Slim micro framework
Keeping it small: Getting to know the Slim micro framework
 
Php 101: PDO
Php 101: PDOPhp 101: PDO
Php 101: PDO
 
PHP 102: Out with the Bad, In with the Good
PHP 102: Out with the Bad, In with the GoodPHP 102: Out with the Bad, In with the Good
PHP 102: Out with the Bad, In with the Good
 
Intro to #memtech PHP 2011-12-05
Intro to #memtech PHP   2011-12-05Intro to #memtech PHP   2011-12-05
Intro to #memtech PHP 2011-12-05
 
TDD in PHP - Memphis PHP 2011-08-25
TDD in PHP - Memphis PHP 2011-08-25TDD in PHP - Memphis PHP 2011-08-25
TDD in PHP - Memphis PHP 2011-08-25
 
Zend_Form to the Rescue - A Brief Introduction to Zend_Form
Zend_Form to the Rescue - A Brief Introduction to Zend_FormZend_Form to the Rescue - A Brief Introduction to Zend_Form
Zend_Form to the Rescue - A Brief Introduction to Zend_Form
 
Zero to ZF in 10 Minutes
Zero to ZF in 10 MinutesZero to ZF in 10 Minutes
Zero to ZF in 10 Minutes
 
Tdd in php a brief example
Tdd in php   a brief exampleTdd in php   a brief example
Tdd in php a brief example
 
A Brief Introduction to Zend_Form
A Brief Introduction to Zend_FormA Brief Introduction to Zend_Form
A Brief Introduction to Zend_Form
 
Zero to Zend Framework in 10 minutes
Zero to Zend Framework in 10 minutesZero to Zend Framework in 10 minutes
Zero to Zend Framework in 10 minutes
 

Recently uploaded

Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksSoftradix Technologies
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsHyundai Motor Group
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentationphoebematthew05
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsPrecisely
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 

Recently uploaded (20)

Benefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other FrameworksBenefits Of Flutter Compared To Other Frameworks
Benefits Of Flutter Compared To Other Frameworks
 
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter RoadsSnow Chain-Integrated Tire for a Safe Drive on Winter Roads
Snow Chain-Integrated Tire for a Safe Drive on Winter Roads
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
costume and set research powerpoint presentation
costume and set research powerpoint presentationcostume and set research powerpoint presentation
costume and set research powerpoint presentation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Unlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power SystemsUnlocking the Potential of the Cloud for IBM Power Systems
Unlocking the Potential of the Cloud for IBM Power Systems
 
The transition to renewables in India.pdf
The transition to renewables in India.pdfThe transition to renewables in India.pdf
The transition to renewables in India.pdf
 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Pigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping ElbowsPigging Solutions Piggable Sweeping Elbows
Pigging Solutions Piggable Sweeping Elbows
 
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
Transcript: #StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 

Password Hashing: The Right Way