Auf Thema antworten

Ok, du hast Recht, mit den Benamungen passt etwas nicht (decryt vs encrypt).


EmailSetting = Das Emailpostfach

-> Hier passiert das beim Speichern, also sobald der User Username und PW in der GUI eingibt.


[CODE=java]   

// Zufälliger Schlüssel erstellen

 String randomString = PasswordHelperClass.createRandomKey(8);


 // Das Passwort verschlüsseln (getPassword() ist das "richtige" Passwort, das der User in der GUI eingibt)

emailSetting.setRandomPasswordHash(randomString);

emailSetting.setPassword(PasswordHelperClass.decryptPassword(emailSetting.getPassword(), randomString));


// Danach wird [B]EmailSettingPassword [/B]gespeichert (in einer Liste werden die User gespeichert, die auf das Postfachzugriff haben sollen und diese an die create() - Methode übergeben)

[/CODE]


Das heißt in meiner DB steht dann als getPasswort sowas, zB:

f33PZy42323WZb6sUGAsgYOg==

-> RandomPasswordHash wird nicht in der DB gespeichert.



EmailSettingPassword 

= Das Emailpostfach, auf welches ein User Zugriff hat (1 EmailSetting .... n EmailSettingPassword)


[CODE=java]


String passwordEncrpyt = emailSettingPassword.getEmailSetting().getRandomPasswordHash();


String password = PasswordHelperClass.decryptPassword(passwordEncrpyt,

                emailSettingPassword.getEmployee().getUser().getPassword());

emailSettingPassword.setPasswordHash(password);[/CODE]


Dann steht in der DB sowas in "PasswordHash" in EmailSettingPassword ("Hash" ist hier falsch betitelt, es ist verschlüsselt)

Qbix2332323RWa32NA==

------------------------


Um das Passwort dann wieder zu bekommen, geschieht das:

[CODE=java]       


// user.getPassword() is der Hashwert (SHA512) des PW vom Login des Users

String passwordEncryptUser = PasswordHelperClass.encryptPassword(emailSettingPassword.getPasswordHash(),

                user.getPassword());

 String passwordEncrypt = PasswordHelperClass.encryptPassword(emailSetting.getPassword(), passwordEncryptUser);


return passwordEncrypt;

[/CODE]


Hier noch die encryptPassword - Methode

[CODE=java]    public static String encryptPassword(String password, String decryptKey) throws NoSuchAlgorithmException, IOException,

            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidKeyException {


        if (password == null)

            return null;


        // byte-Array erzeugen

        byte[] key = (decryptKey).getBytes("UTF-8");

        // aus dem Array einen Hash-Wert erzeugen mit MD5 oder SHA

        MessageDigest sha = MessageDigest.getInstance("MD5");

        key = sha.digest(key);

        // nur die ersten 128 bit nutzen

        key = Arrays.copyOf(key, 16);

        // der fertige Schluessel

        SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");


        // BASE64 String zu Byte-Array konvertieren

        byte[] crypted2 = Base64.getDecoder().decode(password);


        // Entschluesseln

        Cipher cipher2 = Cipher.getInstance("AES");

        cipher2.init(Cipher.DECRYPT_MODE, secretKeySpec);


        byte[] cipherData2 = cipher2.doFinal(crypted2);

        String erg = new String(cipherData2);


        return erg;

    }[/CODE]


Fakt ist, das Email Passwort kann ich nicht einfach so in die Datenbank schreiben, aber ich brauche zwingend den Username und das PW, um Zugriff zu haben. Ich sehe keine Weg, wie ich das lösen sollte, wenn ich Username und PW der Emailinbox nicht habe. Der User könnte sich natürlich jedes Mal erneut in der GZU anmelden, sodass ich das PW nicht speichern muss und es nur für die Session gilt, aber das ist nicht das, was ich brauche...

 

Bei Gmail kann man das denke ich über einen API Token lösen, aber das Problem ist, dass ich nicht nur Gmail Adressen habe.



Oben