使用EclipseLink&存储SHA-1哈希PostgreSQL的

时间:2010-11-24 09:25:05

标签: exception postgresql jpa eclipselink sha1

我正在使用eclipselink作为JPA实现和PostgreSQL,并希望在数据库中存储SHA-1哈希。 但是我得到了这样的例外:

  

内部异常:org.postgresql.util.PSQLException:错误:编码“UTF8”的无效字节序列:0x00   错误代码:0   调用:INSERT INTO mbm_user(USERNAME,PRENAME,LASTNAME,PASSWORD)VALUES(?,?,?,?)       bind => [Hans,null,null,THE SHA-1 HASH]

SHA-1 HASH是一些乱码,我不能把它们贴在这里。

我的实体:

@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或在其他地方出现问题?

1 个答案:

答案 0 :(得分:2)

您正在尝试将一个byte []填充到一个字符串中,该字符串永远不会正常工作。

  1. 将SHA-1哈希保留为blob。我的头顶:
  2.     @Lob
        @Column(nullable = false)
        private byte[] passwordHash;
    
    1. 将二进制数据编码为文本表示形式,可以是十六进制字符串,也可以是Base64。谷歌的binaryToHexString或base64encoder,应该让你走在正确的轨道上。