2015-11-27 47 views
2

我有兩種方法在Java中,我想在php中做同樣的方法。我不知道什麼在php中。我該怎麼做?SHA1加密和SHA1到十六進制php

方法1:

public static String encyptPassword (String in) throws UnsupportedEncodingException, NoSuchAlgorithmException{ 
    byte[] bytes=in.getBytes("UTF-8"); 
    MessageDigest md=MessageDigest.getInstance(MGF1ParameterSpec.SHA1.getDigestAlgorithm()); 
    md.update(bytes); 
    byte[] digest=md.digest(); 
    return toHex(digest); 
} 

方法2:

public static String toHex(byte[] bytes) { 
    BigInteger bi = new BigInteger(1, bytes); 
    return String.format("%0" + (bytes.length << 1) + "x", bi); 
} 

在PHP中的方法(?函數)必須具有相同的結果在Java中,因爲它是散列密碼工作和在線登錄系統。

我試了3個小時左右,但我無法做到或找到解決方案。我想我讀了Stack上的所有帖子。你可以幫我嗎?謝謝。

+0

請注意,用SHA *散列密碼是不正常的e,尤其是無懈可擊的,因爲它太快了。 SHA1可以以[30 Giga SHA1 /秒](http://hashcat.net/oclhashcat/#performance)的速度強制強制,這就是爲什麼人們應該使用像BCrypt或PBKDF2這樣的成本因子的慢哈希函數。 – martinstoeckli

回答

2

PHP Fiddle - 命中看到運行結果

<?php 

    $pass = '[email protected]'; 
    $hashed = hash("SHA512", $pass); 
    echo $hashed; 
    echo '<hr>' . bin2hex($hashed); 

?> 

以上是sha512,這當然是好是sha1,並且成本相當高bcrypt被視爲目前最好的

+0

謝謝大家的幫助。我選擇你的回答是因爲你告訴我如何散列和如何對它進行十六進制。 @Sammitch是一個很好的回答,我會研究一個相當不錯的鏈接。 gregn3給出相同的迴應。再次,謝謝大家。 – Alan

+0

歡迎您,我很高興它有所幫助,@Sammitch寫作認爲最佳實踐,'sha1'生成40個字符,並且對於容易和已知的密碼,它可以通過暴力或彩虹等技術破解,有幾個網站它提供免費的「*解密*」,i.re:https://hashkiller.co.uk/sha1-decrypter.aspx,'sha512'更好,它可以產生128個字符,但如果你使用動態醃製它改進得更好,新的內置password_hash($ string)是當前最好的選擇。享受編碼 –

2
  1. Hashing != Encryption
  2. SHA1較弱,SHA2較好,bcrypt是當前密碼存儲的最佳普遍可用的散列算法。
  3. $myHash = hash("SHA1", "foobar")Docs
  4. 不要使用#3,使用$myActuallySecureHash = password_hash("foobar")Docs
  5. 使用#4。
  6. PHP < 5.4 is not an excuse.
+0

好的。它是哈希密碼。你知道'toHex($ myActuallySecureHash)'的方法嗎? – Alan

+1

@Alan怎麼樣'$ hex = bin2hex($ myActuallySecureHash);'? – gregn3