3b) Impose difficult verification on only the attacker HMAC-SHA-256( [private key], [salt] + [password] ) Protect this key as any private key using best practices Store the key outside the credential store Build the password-to-hash conversion as a separate webservice (cryptograpic isolation).
{"Image DocumentName": "\u00a92007 Ernst & Young Advanced Security Center", "Image ImageDescription": "April 15, b) Impose difficult verification on only the attacker HMAC-SHA-256( [private key], [salt] + [password] ) Protect this key as any private key using best practices. Store the key outside the credential store. Build the password-to-hash conversion as a separate webservice (cryptograpic isolation). HMACs inherit properties of hash functions including their speed, allowing for near instant verification. Key size imposes intractable size- and/or space- requirements on compromise--even for common credentials (aka password = \u2018password\u2019). Designers protecting stored credentials with keyed functions: Use a single site-wide key; Protect this key as any private key using best practices; Store the key outside the credential store (aka: not in the database); Generate the key using cryptographically-strong pseudo-random data; Do not worry about output block size (i.e. SHA-256 vs. SHA-512). Example protect() pseudo-code follows: return [salt] + HMAC-SHA-256([key], [salt] + [credential]); Upholding security improvement over (solely) salted schemes relies on proper key management. Design protection/verification for compromise. The frequency and ease with which threats steal protected credentials demands design for failure . having detected theft, a credential storage scheme must support continued operation by marking credential data compromised and engaging alternative credential validation workflows as follows: Protect the user\u2019s account. Invalidate authN \u2018shortcuts\u2019 disallowing login without 2nd factors or secret questions. Disallow changes to account (secret questions, out of band exchange channel setup/selection, etc.) Load & use new protection scheme. Load a new (stronger) protect(credential) function. Include version information stored with form. Set \u2018tainted\u2019/\u2018compromised\u2019 bit until user resets credentials. Rotate any keys and/or adjust protection function parameters (iter count) Increment scheme version number. When user logs in: Validate credentials based on stored version (old or new); if old demand 2nd factor or secret answers. Prompt user for credential change, apologize, & conduct OOB confirmation. Convert stored credentials to new scheme as user successfully log in. Supporting workflow outlined above requires tight integration with Authentication frameworks and workflows.", "Image XResolution": "37", "Image YResolution": "37", "Image ResolutionUnit": "Pixels/Centimeter", "Image Software": "SlidePlayer", "Image YCbCrPositioning": "Centered"}