我一直在寻找一种简单的 Java算法来生成伪随机字母数字字符串.在我的情况下,它将被用作一个唯一的会话/密钥标识符,它"很可能"在500K+生成过程中是唯一的(我的需求实际上并不需要更复杂的东西).
理想情况下,我可以根据我的唯一性需求指定长度.例如,生成的长度为12的字符串可能看起来像"AEYGF7K0DM1X".
我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的.当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类.
自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?
我正在寻找一种方法来转换长字符串(从转储),它表示十六进制值到一个字节数组.
但为了保持原创,我会用自己的方式来表达它:假设我有一个"00A0BF"我想要解释为的字符串
byte[] {0x00,0xA0,0xBf}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
我是Java新手,最后使用BigInteger并注意领先的十六进制零.但我觉得它很难看,我确信我错过了一些简单的东西.
我有一个字节数组.我希望将该数组的每个字节字符串转换为其对应的十六进制值.
Java中是否有任何函数将字节数组转换为十六进制?
我正在使用一些示例java代码来制作md5哈希.一部分将结果从字节转换为十六进制数字的字符串:
byte messageDigest[] = algorithm.digest();
StringBuffer hexString = new StringBuffer();
for (int i=0;i<messageDigest.length;i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
Run Code Online (Sandbox Code Playgroud)
但是,由于toHexString显然会从前导零中掉落,所以它并不常用.那么,从字节数组到保持前导零的十六进制字符串的最简单方法是什么?
为什么我问这个问题:
我知道有很多关于AES加密的问题,即使对于Android也是如此.如果你在网上搜索,有很多代码片段.但是在每一个页面上,在每个Stack Overflow问题中,我都发现了另一个具有重大差异的实现.
所以我创建了这个问题以找到"最佳实践".我希望我们可以收集最重要的要求列表,并建立一个非常安全的实施!
我读到了初始化载体和盐.并非我发现的所有实现都具有这些功能.所以你需要它吗?它是否会增加安全性?你是如何实现它的?如果加密数据无法解密,算法是否应该引发异常?或者这是不安全的,它应该只返回一个不可读的字符串?算法可以使用Bcrypt而不是SHA吗?
我发现这两个实现怎么样?他们还好吗?缺少完美或一些重要的事情?这些是安全的吗?
算法应该使用字符串和"密码"进行加密,然后使用该密码加密字符串.输出应该是一个字符串(十六进制或base64?).当然,解密也应该是可能的.
什么是Android的完美AES实现?
实施#1:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.SecretKeySpec;
public class AdvancedCrypto implements ICrypto {
public static final String PROVIDER = "BC";
public static final int SALT_LENGTH = 20;
public static final int IV_LENGTH = 16;
public static final int PBE_ITERATION_COUNT = 100;
private static final String RANDOM_ALGORITHM = "SHA1PRNG";
private static final String HASH_ALGORITHM = "SHA-512";
private static final …Run Code Online (Sandbox Code Playgroud) 在Objective C中,我一直使用以下代码来散列字符串:
-(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]
];
}
Run Code Online (Sandbox Code Playgroud)
现在我需要相同的Android,但无法找到如何做到这一点.我一直在寻找这样的例子:在Android上进行SHA1加密? 但这并没有给我与iPhone相同的结果.谁能指出我正确的方向?
在我的字节数组中,我有一个消息的哈希值,它由一些负值和正值组成.使用该(char)byte[i]语句可以轻松打印正值.现在我怎么能得到负值
我正在尝试使用HMAC-SHA256算法创建签名,这是我的代码.我正在使用US ASCII编码.
final Charset asciiCs = Charset.forName("US-ASCII");
final Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
final SecretKeySpec secret_key = new javax.crypto.spec.SecretKeySpec(asciiCs.encode("key").array(), "HmacSHA256");
final byte[] mac_data = sha256_HMAC.doFinal(asciiCs.encode("The quick brown fox jumps over the lazy dog").array());
String result = "";
for (final byte element : mac_data)
{
result += Integer.toString((element & 0xff) + 0x100, 16).substring(1);
}
System.out.println("Result:[" + result + "]");
Run Code Online (Sandbox Code Playgroud)
我从上面的代码得到的结果是:
f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
Run Code Online (Sandbox Code Playgroud)
这与wiki中显示的相同
HMAC_SHA256("key", "The quick brown fox jumps over the lazy dog") = 0x f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8
Run Code Online (Sandbox Code Playgroud)
除了为0x.
我正在寻找想法/评论,如果我做的一切正确或可能是我可以改进我的代码.
我有字节数组,由十六进制值组成 CA ,FA,21,33
但我想将它们JList列为单个元素CAFA2133.为了在JList中列出它们,我想我需要将其转换为string.那么任何推荐?