Secure password hashing in c++ using cryptopp
ich hab mir eine passwort hashing funktion gezimmert und hab aber zweifel ob sie sicher ist. was denkt ihr? #include <cryptopp/hex.h> #include <cryptopp/sha.h> #include <cryptopp/base64.h> #include <random> using std::string; std::<string,string> hash_password(const string password) { std::mt19937 rng; rng.seed(std::random_device()()); std::uniform_real_distribution<std::mt19937::result_type> dist(0,1); string salt = std::to_string(dist(rng)); CryptoPP::SHA256 hash; byte digest[CryptoPP::SHA256::DIGESTSIZE]; std::string output; hash.CalculateDigest(digest,(const byte *)salt.c_str(),salt.size()); CryptoPP::HexEncoder encoder; CryptoPP::StringSink *SS = new CryptoPP::StringSink(output); encoder.Attach(SS); encoder.Put(digest,sizeof(digest)); encoder.MessageEnd(); return {output, salt}; }
Soweit ich weiß sollte man für Passwörter hash Funktionen verwenden, welche für Passwörter gemacht wurden und nicht die "üblichen verdächtigen" wie SHA. Hier gibts dazu ne ganze Menge infos: https://crackstation.net/hashing-security.htm LG Sebastian Am 12. September 2018 13:09:39 MESZ schrieb Amir <amir@viel-zu.org>:
ich hab mir eine passwort hashing funktion gezimmert und hab aber zweifel ob sie sicher ist. was denkt ihr?
#include <cryptopp/hex.h> #include <cryptopp/sha.h> #include <cryptopp/base64.h> #include <random>
using std::string;
std::<string,string> hash_password(const string password) { std::mt19937 rng; rng.seed(std::random_device()()); std::uniform_real_distribution<std::mt19937::result_type> dist(0,1);
string salt = std::to_string(dist(rng)); CryptoPP::SHA256 hash; byte digest[CryptoPP::SHA256::DIGESTSIZE]; std::string output;
hash.CalculateDigest(digest,(const byte *)salt.c_str(),salt.size());
CryptoPP::HexEncoder encoder; CryptoPP::StringSink *SS = new CryptoPP::StringSink(output); encoder.Attach(SS); encoder.Put(digest,sizeof(digest)); encoder.MessageEnd();
return {output, salt}; }
_______________________________________________ intern mailing list intern@lists.metalab.at https://metalab.at/wiki/Intern_Abonnement_Verwalten https://lists.metalab.at/mailman/listinfo/intern
Vielen Dank für das feeback on- und offlist. Hier die überarbeitete version: std::pair<string,string> hash_password(const string password) { using namespace CryptoPP; unsigned int iterations = 1000000; AutoSeededRandomPool rng; SecByteBlock pwsalt(AES::DEFAULT_KEYLENGTH); rng.GenerateBlock(pwsalt,pwsalt.size()); SecByteBlock derivedkey(AES::DEFAULT_KEYLENGTH); PKCS5_PBKDF2_HMAC<SHA256>( derivedkey, derivedkey.size(), 0x00, (byte *) password.data(), password.size(), pwsalt, pwsalt.size(), iterations ); std::string salthex; StringSource ss1(pwsalt,pwsalt.size(),true, new HexEncoder( new StringSink(salthex) ) ); std::string derivedhex; StringSource ss2(derivedkey,derivedkey.size(),true, new HexEncoder( new StringSink(derivedhex) ) ); return {derivedhex, salthex}; } On 09/12/2018 01:31 PM, reox wrote:
Soweit ich weiß sollte man für Passwörter hash Funktionen verwenden, welche für Passwörter gemacht wurden und nicht die "üblichen verdächtigen" wie SHA. Hier gibts dazu ne ganze Menge infos: https://crackstation.net/hashing-security.htm
LG Sebastian
Am 12. September 2018 13:09:39 MESZ schrieb Amir <amir@viel-zu.org>:
ich hab mir eine passwort hashing funktion gezimmert und hab aber zweifel ob sie sicher ist. was denkt ihr?
#include <cryptopp/hex.h> #include <cryptopp/sha.h> #include <cryptopp/base64.h> #include <random>
using std::string;
std::<string,string> hash_password(const string password) { std::mt19937 rng; rng.seed(std::random_device()()); std::uniform_real_distribution<std::mt19937::result_type> dist(0,1);
string salt = std::to_string(dist(rng)); CryptoPP::SHA256 hash; byte digest[CryptoPP::SHA256::DIGESTSIZE]; std::string output;
hash.CalculateDigest(digest,(const byte *)salt.c_str(),salt.size());
CryptoPP::HexEncoder encoder; CryptoPP::StringSink *SS = new CryptoPP::StringSink(output); encoder.Attach(SS); encoder.Put(digest,sizeof(digest)); encoder.MessageEnd();
return {output, salt}; } ------------------------------------------------------------------------ intern mailing list intern@lists.metalab.at https://metalab.at/wiki/Intern_Abonnement_Verwalten https://lists.metalab.at/mailman/listinfo/intern
_______________________________________________ Metalab mailing list Metalab@lists.metalab.at https://lists.metalab.at/mailman/listinfo/metalab
On Wed, Sep 12, 2018 at 01:37:50PM +0200, Amir wrote:
Vielen Dank für das feeback on- und offlist.
Hier die überarbeitete version:
Warum willst Du was selber machen? Es gibt ja gute PW-Hashes wo Du die Schwierigkeit (und damit die Auführungsdauer) einstellen kannst *und* wo schon jemand gezeigt hat, dass man das nicht beschleunigen kann (und es gibt sogar Funktionen wo auch die Memory-Consumption nicht einschränkbar ist). Damit spielst Du, wenn Du was besseres machst, in einer Liga wo Du das auf einer internationalen Konferenz publizieren solltest. Wenn nicht, nimm lieber was wo schon jemand gezeigt hat dass es "schwierig" zu parallelisieren ist. Beispiele für existierende Hash-Funktionen explizit für PWs: - PBKDF2 - bcrypt - scrypt lG Ralf -- Ralf Schlatterbeck email: ralf@zoo.priv.at
On 09/13/2018 08:59 AM, Ralf Schlatterbeck wrote:
On Wed, Sep 12, 2018 at 01:37:50PM +0200, Amir wrote:
Vielen Dank für das feeback on- und offlist.
Hier die überarbeitete version:
Warum willst Du was selber machen?
Will ich garnicht.
Es gibt ja gute PW-Hashes wo Du die Schwierigkeit (und damit die Auführungsdauer) einstellen kannst *und* wo schon jemand gezeigt hat, dass man das nicht beschleunigen kann (und es gibt sogar Funktionen wo auch die Memory-Consumption nicht einschränkbar ist). Damit spielst Du, wenn Du was besseres machst, in einer Liga wo Du das auf einer internationalen Konferenz publizieren solltest. Wenn nicht, nimm lieber was wo schon jemand gezeigt hat dass es "schwierig" zu parallelisieren ist.
Beispiele für existierende Hash-Funktionen explizit für PWs: - PBKDF2 - bcrypt - scrypt
Ich verwende in dem Beispiel PBKDF2.
Teilnehmer (3)
-
Amir -
Ralf Schlatterbeck -
reox