2010-11-24 41 views
1

我使用eclipselink作爲JPA實現和PostgreSQL,並且希望在數據庫中存儲SHA-1哈希。 但我發現了一個異常這樣的:使用EclipseLink和PostgreSQL存儲SHA-1哈希

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]

的SHA-1散列是一些亂碼字符,我可以他們在這裏無法粘貼。

我的實體:

@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; 
     ... 
     ... 
} 

而且在那裏我產生了SHA-1散列的方法:

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(); 
    } 
} 

如何避免非法字符爲0x00的使用或者是問題在其他地方?

回答

2

您正在嘗試將字節[]填充到字符串中,該字符串永遠不會運行正常。

  1. 將SHA-1散列作爲blob存在。關閉我的頭頂:
 
    @Lob 
    @Column(nullable = false) 
    private byte[] passwordHash; 
  1. 編碼的二進制數據到一個文本表示,無論是作爲一個十六進制字符串或類似的Base64東西。谷歌的binaryToHexString或base64encoder,這應該把你放在正確的軌道上。
+0

謝謝,我把它轉換成Base64字符串,就是這樣。 – LeonS 2010-11-24 11:36:57