/** * Speichert die PIN temporaer fuer diese Session. * * @param passport der Passport. * @param pin die PIN. * @throws Exception */ private static void setCachedPIN(HBCIPassport passport, String pin) throws Exception { String key = getCacheKey(passport); // Kein Key, dann muessen wir nicht cachen if (key == null) return; ByteArrayInputStream bis = new ByteArrayInputStream(pin.getBytes()); ByteArrayOutputStream bos = new ByteArrayOutputStream(); Application.getSSLFactory().encrypt(bis, bos); byte[] crypted = bos.toByteArray(); if (Settings.getCachePin()) { pinCache.put(key, crypted); } // Permanentes Speichern der PIN gibts nur bei PIN/TAN, da dort ueber // die TAN eine weitere Autorisierung bei der Ausfuehrung von Geschaeftsvorfaellen // mit Geldfluss stattfindet. Bei DDV/RDH koennte man sonst beliebig Geld // transferieren, ohne jemals wieder nach einem Passwort gefragt zu werden. if (Settings.getStorePin() && (passport instanceof HBCIPassportPinTan)) { // Nicht direkt das Byte-Array speichern sondern einen Base64-String. // Grund: Bei einem Byte-Array wuerde der XML-Serializer fuer jedes // Byte ein einzelnes XML-Element anlegen und damit das Wallet aufblasen Settings.getWallet().set(key, Base64.encode(crypted)); } }
/** @see de.willuhn.datasource.serialize.AbstractXmlIO.Value#serialize(java.lang.Object) */ public String serialize(Object o) throws IOException { if (o == null) return ""; if (!(o instanceof byte[])) throw new IOException("unable to serialize " + o); return Base64.encode((byte[]) o); }