我尚未使用 Cloudant 对此进行测试,并且我尚未与密码学专家验证此方法的安全性(请这样做),但希望如此可能会为您指明正确的方向:
首先你需要生成一个salt和一个password_sha:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
public class CouchPassword {
public static void main(String[] args) throws NoSuchAlgorithmException {
String password = "123456"; // your password
String salt = genSalt();
password = password + salt;
MessageDigest md = MessageDigest.getInstance("SHA1");
md.update(password.getBytes());
byte byteData[] = md.digest();
System.out.println("Password SHA: " + byteToHexString(byteData) );
System.out.println("Generated Salt: " + salt);
}
public static String genSalt() {
Random ranGen = new SecureRandom();
byte[] salt = new byte[16];
ranGen.nextBytes(salt);
return byteToHexString(salt);
}
public static String byteToHexString(byte[] b) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < b.length; i++) {
sb.append(Integer.toString((b[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
}
// There are libraries to help with generating SHAs and Hex Strings
// but I have choosen not to use those here so the answer is more standalone.
将上面的密码字符串设置为需要的值,然后执行。例如
Password SHA: 316ccb0df3c8bbd8f568347827803682d2c93849
Generated Salt: bba45713ef54016c8ef4b56b6b147936
创建 _user 和 _security 文档(选项 1):
// _user
{
"_id" : "org.couchdb.user:joe",
"type" : "user",
"name" : "joe",
"roles" : ["standarduser"],
"password_sha" : "316ccb0df3c8bbd8f568347827803682d2c93849",
"salt" : "bba45713ef54016c8ef4b56b6b147936"
}
_users 文档中的角色映射到 _security 文档中定义的角色。
// _security
{
"couchdb_auth_only": true,
"members": {
"names": [],
"roles": ["standarduser"]
},
"admins": {}
}
来自CouchDB documentation
数据库成员 - 按数据库定义。他们可以从数据库中读取所有类型的文档,并且可以将文档写入(和编辑)到数据库中,但设计文档除外。
数据库管理员 - 按数据库定义。他们拥有成员拥有的所有特权以及以下特权:编写(和编辑)设计文档、添加/删除数据库管理员和成员、设置数据库修订限制 (/somedb/_revs_limit API) 并针对数据库执行临时视图 (/somedb/ _temp_view API)。他们不能创建数据库,也不能删除数据库。
在我的示例中,我的用户joe 被赋予了角色standarduser,该角色映射到数据库的数据库成员。
创建 _user 和 _security 文档(选项 2):
请注意,我可以指定member.names,而不是使用roles:
// _user document
{
"_id" : "org.couchdb.user:joe",
"type" : "user",
"name" : "joe",
"password_sha" : "316ccb0df3c8bbd8f568347827803682d2c93849",
"salt" : "bba45713ef54016c8ef4b56b6b147936"
}
// _security document
{
"couchdb_auth_only": true,
"members": {
"names": ["joe"],
"roles": []
},
"admins": {}
}
警告
确保member.names 和member.roles 参数不为空,因为这将授予所有人读写权限:
{
"couchdb_auth_only": true,
"members": {
"names": [],
"roles": []
},
"admins": {}
}
没有成员,任何用户都可以编写常规文档(任何非设计文档)并从数据库中读取文档。
来源:http://wiki.apache.org/couchdb/Security_Features_Overview