【问题标题】:Symfony FOSUser Hash algorithm in javajava中的Symfony FOSUser哈希算法
【发布时间】:2017-08-22 17:38:50
【问题描述】:

嘿,每个人都想找出我的symfony FOS User Bundle使用了哪种哈希算法,我做了一些研究,提到FOSUser Bundle默认安全配置使用Sha512()并在5000次+ salt 然后 bas64 编码我实际上是这些 hash 算法的新手,但是这是 php 中的算法

$password = 'toto';
$salt = '1234';
$salted = $password.'{'.$salt.'}';
$digest = hash('sha512', $salted, true);

for ($i=1; $i<5000; $i++) {
  $digest = hash('sha512', $digest.$salted, true);
}

$encodedPassword = base64_encode($digest); 
}

取自这篇帖子How do I generate a SALT in Java for Salted-Hash?

因为我不熟悉java hash libraries 谁能帮我把这段代码翻译成Java

【问题讨论】:

  • 能不能说的清楚点,登录需要这个吗?
  • 感谢您的回答,实际上我想从 java 应用程序登录

标签: java php hash symfony-3.1


【解决方案1】:

解决方案是使用像MessageDigestPasswordEncoder 这样对密码进行编码的Java API:

  1. 生成盐(长度=43):

    private static String generateSalt() {
    SecureRandom random = new SecureRandom();
    byte[] salt = new byte[SALT_SIZE];
    random.nextBytes(salt);
    String saltBase64_encoded=BaseEncoding.base64().encode(salt);
    String saltPlusDot= saltBase64_encoded.replace("+",".");
    return saltPlusDot.substring(0,saltPlusDot.length()-1);
    

    }

BaseEncoding.base64() 是commons-codec api中的一个类

  1. concat: 密码 + { + salt + }:

    private static String mergePasswordAndSalt(String pass, String salt) {
    if (salt == null) {
        return salt;
    }
    String cg="{";String cd="}";
    return pass+cg+salt+cd;
    

    }

  2. 对于每个额外的迭代:散列前一个摘要的 concat + 盐:

私有静态字节[] encodePassword(字符串密码,字符串盐) 抛出 NoSuchAlgorithmException,UnsupportedEncodingException {

    String mergedPasswordAndSalt =mergePasswordAndSalt(password, salt);  
    MessageDigest digester = MessageDigest.getInstance(ALGORITHM);

    byte[] hash = digester.digest(mergedPasswordAndSalt .getBytes("UTF-8"));

    for (int i = 1; i < ITERATIONS; ++i) {


     hash = digester.digest(Bytes.concat(hash, mergedPasswordAndSalt.getBytes("UTF-8")));   

    }
        return hash;
    }

Bytes.concat(bytes ...) 是guava 19.0 api中的一个方法

这是github中的APIFOSJcrypt

【讨论】:

    【解决方案2】:

    Symfony 密码加密的默认设置是Bcrypt 这个代码在你的security.yml 配置文件中提到

    encoders:
        Symfony\Component\Security\Core\User\User:
            algorithm: bcrypt
            cost:      15
    

    在我的情况下,我使用了一个技巧,因为我的所有密码都从上午 13 点开始,假设 salt 等于 13 所以我尝试使用 java BCrypt 库将其翻译成 java

    public boolean checkPassword(String passwordText, String DbHash) {
        boolean password_verified = false;
        if (null == DbHash || !DbHash.startsWith("$2a$")) {
            throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison");
        }
        password_verified = BCrypt.checkpw(passwordText, DbHash);
        return (password_verified);
     }
    

    passwordText你的实际密码,DbHash存储的哈希

    如果密码匹配,此代码会检查密码哈希

    有一个技巧 symfony 散列密码以 $2y$ 开头,所以要完成这项工作,您需要将 $2y$ 更改为 $2a$

    例如,我的密码具有存储在我的数据库中的哈希值

    String passwordText = "admin"; 
    String DbHash  = "$2y$13$VVmaKXzaS2QWgU1S4I8h5eJgC/DduF2fXmnhvcynro004GCUAQfr2";
    

    改变这个:

    String DbHash  = "$2y$13$VVmaKXzaS2QWgU1S4I8h5eJgC/DduF2fXmnhvcynro004GCUAQfr2"; 
    

    到这个:

    String DbHash  = "$2a$13$VVmaKXzaS2QWgU1S4I8h5eJgC/DduF2fXmnhvcynro004GCUAQfr2";  
    

    【讨论】:

    • 谢谢,所以我需要添加的只是将第三个字符更改为a
    • 问题是关于 sha512 算法而不是 bcrypt
    猜你喜欢
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2018-05-20
    • 1970-01-01
    • 1970-01-01
    • 2011-12-08
    • 2015-10-27
    相关资源
    最近更新 更多