Ao criar aplicativos da Web que armazenam senhas para seus usuários, nunca é uma boa ideia armazená-las como texto simples em seu banco de dados, seja ele NoSQL ou RDBMS. No ano passado, escrevi sobre Usando o BCrypt com Node.js e Couchbase bem como Usando o BCrypt com Java e Couchbase. E se quisermos levar isso para a Golang?
Veremos como fazer hash de senhas em um aplicativo Golang usando o BCrypt para armazená-las com segurança em Couchbase.
Para esclarecer, estamos interessados no hashing de senhas, não na criptografia de senhas, pois a criptografia implica que a decodificação é possível. O hashing é um processo unidirecional.
O melhor de tudo em Go é que há um BCrypt incorporado. Ao usar esse pacote ou fazer qualquer coisa relacionada ao BCrypt, você se concentrará em duas funções. A geração de um hash e a comparação ou validação de um hash.
Em Go, você poderia gerar um novo hash com base na string de senha, como a seguir:
1 |
hash, erro := bcrypt.GenerateFromPassword([]byte("my-password" (minha senha)), 10) |
Usando o GenerateFromPassword
você passa uma cadeia de caracteres, bem como um valor de custo. Quanto maior o valor do custo, mais lenta será a função, pois o valor do custo é o número de vezes que o hash é aplicado.
Se você quiser ver se uma senha de texto simples corresponde a uma senha com hash, poderá executar o seguinte:
1 |
erro = bcrypt.CompareHashAndPassword([]byte("hashed-password" (senha com hash)), []byte("plaintext-password" (senha de texto simples))) |
Se não houver erro, as senhas coincidiram.
Então, como você pode usar essa funcionalidade de hash de senha com o Couchbase?
Veja, por exemplo, o seguinte:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
tipo Conta estrutura { Tipo string `json:"type,omitempty"` E-mail string `json:"email,omitempty"` Senha string `json:"password,omitempty"` } func principal() { agrupamento, _ := gocb.Conectar("couchbase://localhost") balde, _ := agrupamento.OpenBucket("default", "") e-mail := "test@example.com" passe := "my-password" (minha senha) hash, _ := bcrypt.GenerateFromPassword([]byte(passe), 10) conta := Conta{ Tipo: "account" (conta), E-mail: e-mail, Senha: string(hash), } balde.Inserir(e-mail, conta, 0) conta = Conta{} balde.Obter(e-mail, &conta) erro := bcrypt.CompareHashAndPassword([]byte(conta.Senha), []byte(passe)) se erro != nulo { fmt.Println(erro.Erro()) } } |
O exemplo acima é muito simples, mas mostra como você pode armazenar a senha do BCrypt e como compará-la.
Conclusão
Você acabou de ver como usar o BCrypt em um aplicativo Golang. É fundamental que as informações confidenciais, como senhas, sejam transformadas em hash antes de serem colocadas em seu banco de dados, seja ele NoSQL ou outro.
Para obter mais informações sobre como usar o Couchbase com a Golang, consulte a seção Portal do desenvolvedor do Couchbase.