【问题标题】:password+salt php to java密码+盐 php到java
【发布时间】:2016-12-17 16:49:41
【问题描述】:

我正在尝试将 PHP 中的这段代码转换为 Java,但我得到了不同的结果,错误在哪里?

PHP 代码

public function hashSSHA($password) {

        $salt = sha1(rand());
        $salt = substr($salt, 0, 10);
        $salt = "172ba59e6b";
        $encrypted = base64_encode(sha1($password . $salt, true) . $salt);
        $hash = array("salt" => $salt, "encrypted" => $encrypted);
        return $hash;
    }

Java

private Map senha(String password){
    Map<String, String> pass = new HashMap<String, String>();
    String salt = sha1(Integer.toString((int) Math.random()));
    salt = salt.substring(0,10).toLowerCase();
    salt = "172ba59e6b";
    String tobase64 = toSHA1((password + salt).getBytes()) + salt;
    byte[] encodedBytes = Base64.encodeBase64(tobase64.getBytes());
    String encrypted = new String(encodedBytes);
    String[] array;
    pass.put("salt",salt);
    pass.put("encrypted",encrypted);
    Log.d("asd",encrypted);

    return pass;

}

Java sha1 函数

public String sha1(String s) {
        try {
            // Create MD5 Hash
            MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");
            digest.update(s.getBytes());
            byte messageDigest[] = digest.digest();

            // Create Hex String
            StringBuffer hexString = new StringBuffer();
            for (int i = 0; i < messageDigest.length; i++)
                hexString.append(String.format("%02X", 0xFF & messageDigest[i]));
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

Java sha1bin

public static String toSHA1(byte[] convertme) {
        MessageDigest md = null;
        try {
            md = MessageDigest.getInstance("SHA-1");
        }
        catch(NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return new String(md.digest(convertme));
    }

我哪里错了?有什么简单的方法吗?

在使用 salt=172ba59e6b 的 java 上:

String tobase64 = toSHA1(("muranga21" + salt).getBytes()) + salt; 

返回:��{��b�v����r���t�172ba59e6b

在盐=172ba59e6b 的 PHP 上:

$sha1 = sha1("muranga21" . $salt, true) . $salt; 

返回:��{��b�v����r���t�172ba59e6b

但是当我尝试做base64编码时:

在 php 上我得到了:

o/exe6eNHGKbdvy6jd1ym6uddKExNzJiYTU5ZTZi

在java上:

77+977+9e++/ve+/vRxi77+9du+/ve+/vXLvv73vv73vv71077+9MTcyYmE1OWU2Yg==

【问题讨论】:

  • 安全漏洞: 从不使用String 类型来保存密码(例如您的senhasha1 方法)。请改用byte 数组(即byte[])并确保在丢弃引用之前覆盖其内容。
  • 不要创建自己的密码哈希函数。使用 PHP 的密码哈希 API! php.net/password

标签: java php password-encryption


【解决方案1】:

您使用的是随机盐。当然每次运行代码都会得到不同的结果...

【讨论】:

  • 在带有盐 172ba59e6b 的 java 上: String tobase64 = toSHA1(("muranga21" + salt).getBytes()) + salt;返回:��{��b�v����r���t�172ba59e6b 在 PHP 上使用盐 172ba59e6b: $sha1 = sha1("muranga21" . $salt, true) 。 $盐;返回:��{��b�v����r���t�172ba59e6b 但是当我尝试做base64编码时:在php上我得到:o/exe6eNHGKbdvy6jd1ym6uddKExNzJiYTU5ZTZi 在java上:77+977+9e++/ve+/vRxi77 +9du+/ve+/vXLvv73vv73vv71077+9MTcyYmE1OWU2Yg==
猜你喜欢
  • 2012-07-04
  • 2014-05-03
  • 2011-08-07
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2021-07-23
  • 2010-11-30
  • 2012-07-05
相关资源
最近更新 更多