2010-11-24 5 views
1

Ich benutze Eclipselink als JPA-Implementierung und PostgreSQL und möchte SHA-1 Hashes in der Datenbank speichern. Aber ich bin eine Ausnahme wie folgt erhalten:Speichern von SHA-1 Hashes mit EclipseLink & PostgreSQL

Internal Exception: org.postgresql.util.PSQLException: ERROR: invalid byte sequence for encoding "UTF8": 0x00 Error Code: 0 Call: INSERT INTO mbm_user (USERNAME, PRENAME, LASTNAME, PASSWORD) VALUES (?, ?, ?, ?) bind => [Hans, null, null, THE SHA-1 HASH]

den SHA-1-Hash sind einige Zeichen, unsinnige und ich kann sie nicht hier einfügen.

Mein Entity:

@Entity 
@Table(name="mbm_user") 
public class User extends CanAccessBook{ 

    @Id @GeneratedValue(strategy=GenerationType.IDENTITY) 
    @Column(nullable = false) 
    private Long id; 

    @Column(nullable = false) 
    private String username; 

    @Column(nullable = false) 
    private String password; 

    private String prename; 

    private String lastname; 
     ... 
     ... 
} 

Und die Methode, wo ich den SHA-1-Hash generieren:

public void setPassword(String password) { 
    try { 
     MessageDigest md = MessageDigest.getInstance("SHA-1"); 
     byte[] encryptPassword = md.digest(password.getBytes()); 
     this.password = new String(encryptPassword); 
    } catch (NoSuchAlgorithmException e) { 
     e.printStackTrace(); 
    } 
} 

Wie kann ich vermeiden, dass die Nutzung des illegalen char 0x00 oder ist das Problem woanders ?

Antwort

2

Sie versuchen, ein Byte [] in einen String zu stopfen, was nie gut funktionieren wird.

  1. Behalten Sie den SHA-1-Hash als Blob. Aus der Spitze von meinem Kopf:
 
    @Lob 
    @Column(nullable = false) 
    private byte[] passwordHash; 
  1. Encode der binären Daten in eine Textdarstellung, entweder als hexadezimale Zeichenfolge oder so etwas wie Base64. Google für binaryToHexString oder base64encoder, das sollte Sie auf den richtigen Weg bringen.
+0

Danke, ich konvertierte es in eine Base64 String, das ist es. – LeonS