75 votes

Comment SHA1 hacher une chaîne dans Android?

En Objective C, j'ai utilisé le code suivant pour hacher une chaîne:

 -(NSString *) sha1:(NSString*)stringToHash {    
    const char *cStr = [stringToHash UTF8String];
    unsigned char result[20];
    CC_SHA1( cStr, strlen(cStr), result );
    return [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
        result[0], result[1], result[2], result[3], 
        result[4], result[5], result[6], result[7],
        result[8], result[9], result[10], result[11],
        result[12], result[13], result[14], result[15],
        result[16], result[17], result[18], result[19]
        ];  
}
 

Maintenant, j'ai besoin de la même chose pour Android mais je ne peux pas savoir comment le faire. Je cherchais, par exemple, des solutions suivantes: Créer un cryptage SHA1 sur Android? mais cela ne me donne pas le même résultat que sur iPhone. Est-ce que quelqu'un peut-il me montrer la bonne direction?

161voto

Amir Raminfar Points 17939

Vous n'avez pas besoin d'andorid pour cela. Vous pouvez simplement le faire en java simple.

Avez-vous essayé un exemple simple en Java et voyez si cela retourne le sha1 correct.

 import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class AeSimpleSHA1 {
    private static String convertToHex(byte[] data) {
        StringBuilder buf = new StringBuilder();
        for (byte b : data) {
            int halfbyte = (b >>> 4) & 0x0F;
            int two_halfs = 0;
            do {
                buf.append((0 <= halfbyte) && (halfbyte <= 9) ? (char) ('0' + halfbyte) : (char) ('a' + (halfbyte - 10)));
                halfbyte = b & 0x0F;
            } while (two_halfs++ < 1);
        }
        return buf.toString();
    }

    public static String SHA1(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        md.update(text.getBytes("iso-8859-1"), 0, text.length());
        byte[] sha1hash = md.digest();
        return convertToHex(sha1hash);
    }
}
 

Partagez également ce que vous attendez de sha1. Peut-être que ObjectC fait le mal.

40voto

Adam Points 6342

Une méthode SHA-1 plus simple: ( mise à jour à partir des suggestions du commentateur, utilisant également un algorithme octet-> chaîne massivement plus efficace )

 String sha1Hash( String toHash )
{
    String hash = null;
    try
    {
        MessageDigest digest = MessageDigest.getInstance( "SHA-1" );
        byte[] bytes = toHash.getBytes("UTF-8");
        digest.update(bytes, 0, bytes.length);
        bytes = digest.digest();

        // This is ~55x faster than looping and String.formating()
        hash = bytesToHex( bytes );
    }
    catch( NoSuchAlgorithmException e )
    {
        e.printStackTrace();
    }
    catch( UnsupportedEncodingException e )
    {
        e.printStackTrace();
    }
    return hash;
}

// http://stackoverflow.com/questions/9655181/convert-from-byte-array-to-hex-string-in-java
final protected static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex( byte[] bytes )
{
    char[] hexChars = new char[ bytes.length * 2 ];
    for( int j = 0; j < bytes.length; j++ )
    {
        int v = bytes[ j ] & 0xFF;
        hexChars[ j * 2 ] = hexArray[ v >>> 4 ];
        hexChars[ j * 2 + 1 ] = hexArray[ v & 0x0F ];
    }
    return new String( hexChars );
}
 

33voto

yarian Points 1396

Si vous pouvez vous en sortir avec l'aide de la Goyave il est de loin le moyen le plus simple de le faire, et vous n'avez pas à réinventer la roue:

final HashCode hashCode = Hashing.sha1().hashString(yourValue, Charset.defaultCharset());

Vous pouvez alors prendre la valeur hachée et obtenez en byte[], comme int, ou en tant que long.

Aucun emballage dans un try catch, pas de manigances. Et si vous décidez que vous voulez utiliser autre chose que SHA-1, Goyave prend également en charge sha256, sha-512, et quelques, je n'avais jamais entendu parler comme adler32 et murmur3.

21voto

Suphi ÇEVİKER Points 35
final MessageDigest digest = MessageDigest.getInstance("SHA-1");
result = digest.digest(stringToHash.getBytes("UTF-8");

// Another way to make HEX, my previous post was only the method like your solution
StringBuilder sb = new StringBuilder();

for (byte b : result) // This is your byte[] result..
{
    sb.append(String.format("%02X", b));
}

String messageDigest = sb.toString();

8voto

Risadinha Points 1254

Android est livré avec Apache Commons Codec ou que vous l'ajouter à la dépendance. Ensuite il faut faire:

String myHexHash = DigestUtils.shaHex(myFancyInput);

C'est la vieille méthode dépréciée vous obtenez avec Android 4 par défaut. Les nouvelles versions de DigestUtils apporter toutes les saveurs de shaHex() méthodes comme sha256Hex() et aussi surcharger les méthodes avec différents types d'arguments.

http://commons.apache.org/proper/commons-codec//javadocs/api-release/org/apache/commons/codec/digest/DigestUtils.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X