Hi Udo and others, I just integrated PBKDF2 hasher into ApplicationSecurity: Usage example:
(ASPasswordVerifier new hasher: ASPBKDF2Hasher new; plainTextPassword: 'testPassword'; storedSalt: '590b223fc584ae96edf3d5dc7e363034'; storedFinalPassword: '2828efb46d56ca2fb004026398d412ef') verify. Cheers, Hernán 2017-07-01 5:03 GMT-03:00 Udo Schneider <udo.schnei...@homeaddress.de>: > Francis, > > I can relate to the idea of easily embedding PBKDF2/bcrypt into your code. > However the functionality of /managing/ the salt is not specificed in > PBKDF2. The spec only covers the actual the hashing part. However wrapping > it into a simple to use wrapper is pretty simple. The code below is > something I use in my code for example: > > "Create a new password instance" > pwd := KNPassword fromPlaintext: 'secret'. > "Now store that instance. It encapsulates hash, generated salt and > the load parameter. Because all the load parameters are accessed via > methods you can also back them with ivars and have different instances > with different load parameters. E.g. for adapting to advances in hash > cracking." > > pwd verify: 'secret'. "Verify the password" > > CU, > > Udo > > > > > > 'From Pharo5.0 of 16 April 2015 [Latest update: #50772] on 1 July 2017 at > 10:01:05.207245 am'! > Object subclass: #KNPassword > instanceVariableNames: 'salt hash' > classVariableNames: 'PRNG' > poolDictionaries: '' > category: 'ThreatNews-Core'! > > !KNPassword methodsFor: 'accessing' stamp: 'UdoSchneider 5/26/2017 11:48'! > salt > ^ salt > ifNil: [ salt := ((1 to: self saltLength) collect: [ :each > | self class prng nextInt: 255 ]) > asByteArray ]! ! > > !KNPassword methodsFor: 'accessing' stamp: 'UdoSchneider 7/1/2017 09:58'! > iterations > ^ 1000! ! > > !KNPassword methodsFor: 'accessing' stamp: 'UdoSchneider 7/1/2017 09:58'! > length > ^ 64! ! > > !KNPassword methodsFor: 'accessing' stamp: 'UdoSchneider 7/1/2017 09:58'! > saltLength > ^ 16! ! > > !KNPassword methodsFor: 'accessing' stamp: 'UdoSchneider 7/1/2017 09:57'! > hashClass > ^ SHA256! ! > > > !KNPassword methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:51'! > setPlaintext: aString > hash := self hashString: aString! ! > > !KNPassword methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:52'! > verify: aString > ^ (self hashString: aString) = hash! ! > > !KNPassword methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:51'! > hashString: aString > ^ PBKDF2 > derivedKeyHashFunction: self hashClass > password: aString > salt: self salt > iterations: self iterations > length: self length! ! > > "-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- "! > > KNPassword class > instanceVariableNames: ''! > > !KNPassword class methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:49'! > reset > PRNG := nil! ! > > !KNPassword class methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:49'! > fromPlaintext: aString > ^ self new > setPlaintext: aString; > yourself! ! > > !KNPassword class methodsFor: 'as yet unclassified' stamp: 'UdoSchneider > 5/26/2017 11:49'! > prng > ^ PRNG ifNil: [ PRNG := Random new ]! ! > > > >