Ruby on rails 检索密码哈希时获取编码错误

Ruby on rails 检索密码哈希时获取编码错误,ruby-on-rails,couchbase,Ruby On Rails,Couchbase,我想通过使用PBKDF2并在数据库中存储密码哈希和salt来实现用户身份验证 我的用户类如下所示 class用户lambda{Time.now} #... 一些不太有趣的验证 创建前:准备要创建的 #返回为给定id找到的用户的文档 def自我检索(id) 返回用户.bucket.get(id) 结束 def加密密码 如果self.password.present存在?然后 hashedpassword=创建密码(self.password) self.password\u hash=hashed

我想通过使用PBKDF2并在数据库中存储密码哈希和salt来实现用户身份验证

我的用户类如下所示

class用户lambda{Time.now}
#... 一些不太有趣的验证
创建前:准备要创建的
#返回为给定id找到的用户的文档
def自我检索(id)
返回用户.bucket.get(id)
结束
def加密密码
如果self.password.present存在?然后
hashedpassword=创建密码(self.password)
self.password\u hash=hashedpassword.value
self.password\u salt=hashedpassword.salt
结束
结束
#使用给定字符串创建新的PBKDF2实例
#和给定的盐。如果没有指定盐
#使用SecureRandom.base(16)字符串
def create_password(pwString,saltString=SecureRandom.urlsafe_base64(16))
密码=PBKDF2.new do | p|
p、 密码=pwString
p、 盐=盐串
p、 迭代次数=5000次
结束
结束
def准备__创建
加密密码
@id=User.bucket.incr(“User\u key”,1,:initial=>1)
结束
结束
控制器如下所示:

Couchbase::Error::ValueFormat (unable to convert value for key '8': lexical error: invalid bytes in UTF8 string.
      :"123456","password_hash":"\r�����;��X�\u001E���S=c\u0018���
                 (right here) ------^
):
class UsersControllerdata[:name],
:姓氏=>数据[:姓氏],
:email=>数据[:email],
:type=>data[:type],
:password=>数据[:password])
将\重定向到根\ url,:notice=>“您已成功注册”+newUser.full\名称
其他的
呈现“新”
结束
结束
结束
它很安全,但是当我调用retrieve来查找用户时,会出现一个异常,看起来密码散列包含非UTF-8字符

看起来是这样的:

Couchbase::Error::ValueFormat (unable to convert value for key '8': lexical error: invalid bytes in UTF8 string.
      :"123456","password_hash":"\r�����;��X�\u001E���S=c\u0018���
                 (right here) ------^
):
现在我想知道我是否需要清理密码。我必须逃避一些角色吗?还是应该使用其他加密功能


PS:我知道密码是以明文形式存储的,我稍后会解决:)

好的,如果你只调用
hashedpassword.value
你就得到了哈希的二进制表示形式,你必须按如下方式调用它:

def encrypt_password
    if self.password.present? then
      hashedpassword = create_password(self.password)
      self.password_hash = hashedpassword.hex_string
      self.password_salt = hashedpassword.salt
  end
end