2014-01-08 4 views
0

나는 DB의 테이블 User(id, password_hash, ....)과의 모델이 있습니다암호 및 암호 해시는

case class User(
    id: Pk[Long] = NotAssigned, 
    email: String, 
    password: Option[String] = None, 
    passwordHash: Option[String] = None 
) 


object User { 

    def create(newUser: User): Option[Long] = //..... 

    //on("password_hash" -> generatePasswordHash(newUser.password) 

    def generatePasswordHash(p: String) = //.... 
} 

점은 Password 필드는 모델 User 존재 만 I을 가득입니다 새 사용자 등록 :

val newUser = User(email = emailFromForm, password = Some(passwordFromForm)) 

암호를 해시로 보내면됩니다. 분명히 db에서 검색하면 Password 필드가 None이되지만 PasswordHash 값이 있습니다.

내가 이어야한다고 생각하기 때문에 PasswordPasswordHash을 옵션으로 만들었습니까? 그래도 그것이 옳은 것인지 틀린 것인지 확실하지 않습니다.

질문은 나의 좋은 접근 방법입니까?

답변

1

User.password을 갖고 싶습니까?

case class User(
    id: Pk[Long] = NotAssigned, 
    email: String, 
    passwordHash: String 
) 

object User { 
    // or maybe Option[User] or Try[User] 
    def create(email: String, password: String): Option[Long] = { 
    val passwordHash = hashPassword(hash) 
    val newUser = User(email, passwordHash) 
    // save newUser to DB 
    } 

    // you may want to distinguish between "no such email" and "wrong password" 
    // in which case you'd have something like Either[PasswordCheckFailure, User] 
    def checkPassword(email: String, password: String): Option[User] = { 
    val possibleUser: Option[User] = // get user by email 
    possibleUser.filter(_.passwordHash = hashPassword(password)) 
    } 

    private def hashPassword(password: String): String = ... 
} 

염분도 있습니다. https://crackstation.net/hashing-security.htm. 이 경우 비밀번호와 동일한 입력란에 저장하거나 다른 입력란을 추가하십시오.

case class User(
    id: Pk[Long] = NotAssigned, 
    email: String, 
    passwordHash: String, 
    passwordSalt: String = // generate random string 
) 
+0

아마도 새 사용자 생성을 위해 필요하기 때문에 비밀번호가 필요하지 않습니다. checkPassword에서 passwordHash를 의미합니까? –

+0

암호 입력란을 제거하고 passwordHash 만 남을 것 같습니다. 그리고 나는 당신과 같이 창조의 시그니처를 바꿀 것입니다. –

+0

"checkPassword에서 비밀번호 해시를 의미합니까?" 아니요, 로그인 양식에서 얻은 비밀번호를 의미합니다. 편집을 참조하십시오. –