Comment sha1 hash une chaîne de caractères en Android?
dans L'objectif C, j'ai utilisé le code suivant pour hachurer 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 ne peut pas savoir comment le faire. J'ai cherché par exemple ceci: faire cryptage SHA1 sur Android? mais ça ne me donne pas le même résultat que sur iPhone. Quelqu'un peut me pointer dans la bonne direction?
8 réponses
vous n'avez pas besoin d'andorid pour ça. Vous pouvez le faire en java simple.
avez-vous essayé un exemple java simple et voir si cela renvoie le sha1 droit.
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");
byte[] textBytes = text.getBytes("iso-8859-1");
md.update(textBytes, 0, textBytes.length);
byte[] sha1hash = md.digest();
return convertToHex(sha1hash);
}
}
partagez aussi ce que votre sha1 attendue devrait être. Peut-être que ObjectC le fait mal.
Un simple SHA-1 méthode: ( mise à jour de l'intervenant suggestions, également à l'aide d'un massivement plus efficace octet->string algorithme )
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 );
}
si vous pouvez vous en tirer avec en utilisant la goyave, c'est de loin la manière la 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 de hachage et d'obtenir aussi un byte[]
, comme un int
, ou comme long
.
Aucun emballage dans un try catch, pas de manigances. Et si vous décidez que vous voulez utiliser autre chose que SHA-1, Guava supporte aussi sha256, sha 512, et quelques-uns que j'ai eu jamais entendu parler d'adler32 et murmur3.
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();
totalement basé sur la réponse de @Whymarrh, c'est mon implémentation, testé et fonctionnel, pas de dépendances:
public static String getSha1Hex(String clearString)
{
try
{
MessageDigest messageDigest = MessageDigest.getInstance("SHA-1");
messageDigest.update(clearString.getBytes("UTF-8"));
byte[] bytes = messageDigest.digest();
StringBuilder buffer = new StringBuilder();
for (byte b : bytes)
{
buffer.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return buffer.toString();
}
catch (Exception ignored)
{
ignored.printStackTrace();
return null;
}
}
Android est livré avec le Codec Commons D'Apache - ou vous l'ajoutez comme dépendance. Puis faire:
String myHexHash = DigestUtils.shaHex(myFancyInput);
qui est l'ancienne méthode dépréciée que vous obtenez avec Android 4 par défaut. Les nouvelles versions de DigestUtils apportent toutes les saveurs des méthodes shaHex() comme sha256Hex () et surchargent également les méthodes avec différents types d'arguments.
La méthode que vous cherchez n'est pas spécifique à Android, mais à Java en général. Vous recherchez le MessageDigest ( import java.security.MessageDigest
).
une mise en œuvre d'une méthode sha512(String s)
peut être vue ici , et le changement pour un hachage SHA-1 serait de changer la ligne 71 à:
MessageDigest md = MessageDigest.getInstance("SHA-1");
String.format("%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]);