开发安全指南:如何安全地储存用户密码
不要存储明文密码,而是存储密码的哈希值。
JAVA
- JAVA第一种方案
在Java程序中进行安全的密码哈希,除了 libsodium还有jBCrypt,能够提供bcrypt密码哈希算法。
1.String hash = BCrypt.hashpw(userProvidedPassword, BCrypt.gensalt());
2.// 验证一个在Java中的bcrypt hash:
3.if (BCrypt.checkpw(userProvidedPassword, hash)) {
4. // Login successful.
5.}
- JAVA第二种方案
有一个java实现的scrypt,但它需要你指定参数,而不会提供一个默认值给你。
1.#Calculating a hash
2.int N = 16384;int r = 8;int p = 1;
3.String hashed = SCryptUtil.scrypt(passwd, N, r, p);
4.# Validating a hash
5.if (SCryptUtil.check(passwd, hashed)) {
6. // Login successful
7.}
Python
- Python 第一种方案
使用bcrypt python 包 (GitHub)
1.import bcryptimport hmac
2.# Calculating a hash
3.password = b"correct horse battery staple"
4.hashed = bcrypt.hashpw(password, bcrypt.gensalt())
5.# Validating a hash (don't use ==)
6.if(hmac.compare_digest(bcrypt.hashpw(password, hashed), hashed)):
7. # Login successful
Python开发人员通常更喜欢passlib (Bitbucket),尽管它的API命名并不正确。(”加密” 而不是 “hash”):
1.from passlib.hash import bcrypt
2.# Calculating a hash
3.hash = bcrypt.encrypt(usersPassword, rounds=12)
4.# Validating a hash
5.if bcrypt.verify(usersPassword, hash):
6. # Login successful
- Python 第二种方案
目前我们发现除了libsodium以外只有django-scrypt package.可以较为健全的实现。其他的我们还在寻找中。