Bcrypt百度百科:
1、 bcrypt,是一个跨平台的文件加密工具。由它加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。
2、bcrypt算法相对来说是运算比较慢的算法,在密码学界有句常话:越慢的算法越安全。算法越算,黑客破解成本越高.通过salt和const这两个值来减缓加密过程,ta的加密时间(百ms级)远远超过md5(大概1ms左右)。对于计算机来说,Bcrypt 的计算速度很慢,但是对于用户来说,这个过程不算慢。bcrypt是单向的,而且经过salt和cost的处理,使其受rainbow攻击破解的概率大大降低,同时破解的难度也提升不少,相对于MD5等加密方式更加安全,而且使用也比较简单.
3、bcrypt加密后的字符串形如:
$2a$10$wouq9P/HNgvYj2jKtUN8rOJJNRVCWvn1XoWy55N3sCkEHZPo3lyWq其中$是分割符,无意义;2a是bcrypt加密版本号;10是cost的值;而后的前22位是salt值;再然后的字符串就是密码的密文了;这里的const值即下面代码中的saltRounds,生成salt的迭代次数,默认值是10,推荐值12。 除了对您的数据进行加密,默认情况下,bcrypt 在删除数据之前将使用随机数据三次覆盖原始输入文件,以阻挠可能会获得您的计算机数据的人恢复数据的尝试。如果您不想使用此功能,可设定禁用此功能。
bcrypt 使用的是布鲁斯·施内尔在1993年发布的 Blowfish 加密算法。具体来说,bcrypt 使用保罗·柯切尔的算法实现。随 bcrypt 一起发布的源代码对原始版本作了略微改动。
简单的说,Bcrypt就是一款加密工具,可以比较方便地实现数据的加密工作。下面是使用Bcrypt对数据加密的一个简单的栗子:
1: 可以官网下载源码,网址:http://www.mindrot.org/projects/jBCrypt/
2: 使用列子
- import java.util.HashMap;
- import java.util.Map;
- import org.apache.commons.lang3.StringUtils;
- /**
- * Bcrypt encryption algorithm
- * @author yue.li3
- *
- */
- public class BcryptCipher {
- // generate salt seed
- private static final int SALT_SEED = 12;
- // the head fo salt
- private static final String SALT_STARTSWITH = "$2a$12";
- public static final String SALT_KEY = "salt";
- public static final String CIPHER_KEY = "cipher";
- /**
- * Bcrypt encryption algorithm method
- * @param encryptSource
- * need to encrypt the string
- * @return Map , two values in Map , salt and cipher
- */
- public static Map<String, String> Bcrypt(final String encryptSource) {
- String salt = BCrypt.gensalt(SALT_SEED);
- Map<String, String> bcryptResult = Bcrypt(salt, encryptSource);
- return bcryptResult;
- }
- /**
- *
- * @param salt encrypt salt, Must conform to the rules
- * @param encryptSource
- * @return
- */
- public static Map<String, String> Bcrypt(final String salt, final String encryptSource) {
- if (StringUtils.isBlank(encryptSource)) {
- throw new RuntimeException("Bcrypt encrypt input params can not be empty");
- }
- if (StringUtils.isBlank(salt) || salt.length() != 29) {
- throw new RuntimeException("Salt can't be empty and length must be to 29");
- }
- if (!salt.startsWith(SALT_STARTSWITH)) {
- throw new RuntimeException("Invalid salt version, salt version is $2a$12");
- }
- String cipher = BCrypt.hashpw(encryptSource, salt);
- Map<String, String> bcryptResult = new HashMap<String, String>();
- bcryptResult.put(SALT_KEY, salt);
- bcryptResult.put(CIPHER_KEY, cipher);
- return bcryptResult;
- }
- }