我已经完成了为项目创建Login API的任务,我应该使用PBACSD25和HMACSHA256作为PRF.使用MD5对纯文本密码进行哈希处理,然后将其输入PBKDF2以生成派生密钥.问题是,我无法获得与项目文档告诉我的相同的输出.
这是Java中的PBKDF2实现:
public class PBKDF2
{
public static byte[] deriveKey( byte[] password, byte[] salt, int iterationCount, int dkLen )
throws java.security.NoSuchAlgorithmException, java.security.InvalidKeyException
{
SecretKeySpec keyspec = new SecretKeySpec( password, "HmacSHA256" );
Mac prf = Mac.getInstance( "HmacSHA256" );
prf.init( keyspec );
// Note: hLen, dkLen, l, r, T, F, etc. are horrible names for
// variables and functions in this day and age, but they
// reflect the terse symbols used in RFC 2898 to describe
// the PBKDF2 algorithm, …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的字符串:
init_thread = "2b11020000ed"
Run Code Online (Sandbox Code Playgroud)
我必须通过蓝牙发送这个字符串,我这样做:
byte[] init = init_thread.getBytes();
GlobalVar.mTransmission.write(init);
Run Code Online (Sandbox Code Playgroud)
我需要的是init_thread在将字符串转换为字节之前定义字符串是十六进制字符串,因为如果我这样做,它就会出错:
现在做什么= 2(1字节),b(1字节),1(1字节),1(1字节)......
必须做什么= 2b(1byte),11(1byte),02(1byte)......
我正在尝试哈希一个BigInteger/BigNum,我在Android/iOS上得到了不同的结果.我需要获得相同的Hash结果,以便两个应用程序按照SRP协议工作.仔细观察它对正数很好,但不适用于负数(第一个半数大于7).不确定哪一个是正确的,哪一个要调整以匹配另一个.
安卓:
void hashBigInteger(String s) {
try {
BigInteger a = new BigInteger(s, 16);
MessageDigest sha = MessageDigest.getInstance("SHA-256");
byte[] b = a.toByteArray();
sha.update(b, 0, b.length);
byte[] digest = sha.digest();
BigInteger d = new BigInteger(digest);
Log.d("HASH", "H = " + d.toString(16));
} catch (NoSuchAlgorithmException e) {
throw new UnsupportedOperationException(e);
}
}
Run Code Online (Sandbox Code Playgroud)
iOS版:
void hashBigNum(unsigned char *c) {
BIGNUM *n = BN_new();
BN_hex2bn(&n, c);
unsigned char buff[ SHA256_DIGEST_LENGTH ];
int len = BN_num_bytes(n);
unsigned char * bin = (unsigned char *) malloc( …Run Code Online (Sandbox Code Playgroud) 我有一个像这样的字节写的文件
\r\x00\x00\x00\xd0{"a": "test"}
Run Code Online (Sandbox Code Playgroud)
其中包含以下字节
[13, 0, 0, 0, -48, 123, 34, 97, 34, 58, 32, 34, 116, 101, 115, 116, 34, 125]
Run Code Online (Sandbox Code Playgroud)
当这个文件被读入Java时,我得到了所有的东西
\\r\\x00\\x00\\x00\\xd0{"a": "test"}
Run Code Online (Sandbox Code Playgroud)
当我.getBytes()在这个字符串上做的时候,我得到了
[92, 114, 92, 120, 48, 48, 92, 120, 48, 48, 92, 120, 48, 48, 92, 120, 100, 48, 123, 34, 97, 34, 58, 32, 34, 116, 101, 115, 116, 34, 125]
Run Code Online (Sandbox Code Playgroud)
我必须将字符串转换为有效字节,遗憾的是我无法更改文件的读取方式.我知道在Python中,你打开一个'rb'模式的文件,你很高兴.如果java具有该能力,我就无法使用它.
简而言之,如何将字符串Java读取转换为写入文件的原始字节数组?
很抱歉,如果这个问题很简单,那么在Java方面我是如此的绿色.
编辑:所以我认为我的问题与提议的"重复问题"链接不同.它没有取得java字符串中的每个字面值并将其转换回字节.java中的字符串已被读者转义. \x00现在是\\x00哪个字节值不一样.所以我想我需要某种方法来取消字符串?
在十六进制编辑器中查看的文件
0000000: 5c72 5c78 3030 5c78 3030 5c78 3030 5c78 \r\x00\x00\x00\x …Run Code Online (Sandbox Code Playgroud) $checksum = md5($someString+$bkey);到$checksum = md5($someString.$bkey);我需要在 Java 中执行以下操作:
$hexString = '90aa';#sample value
$bkey = pack('H*',$hexString);
$someString='qwe';#sample value
$checksum = md5($someString.$bkey);
echo $checksum;
Run Code Online (Sandbox Code Playgroud)
我无法在 Java 中将 hexString 转换为 bkey 以获得与 php 脚本相同的结果。除了bkey一切正常。
如果我删除bkey然后:
PHP:
$someString='qwe';#sample value
$checksum = md5($someString);
echo $checksum;
Run Code Online (Sandbox Code Playgroud)
结果: 76d80224611fc919a5d54f0ff9fba446
爪哇:
String someString = "qwe";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
String checksum = new BigInteger(1, messageDigest.digest(someString
.getBytes())).toString(16);
System.out.println(checksum);
Run Code Online (Sandbox Code Playgroud)
结果: 76d80224611fc919a5d54f0ff9fba446
如您所见,它有效
与bkey:
PHP:
$hexString = '90aa';#sample value
$bkey = …Run Code Online (Sandbox Code Playgroud) 我正在尝试从字符串中获取 Java 中的 MySQL 密码哈希,所以我用谷歌搜索了一下,发现了 MySQL 中的 PASSWORD() 是如何工作的:
SELECT SHA1(UNHEX(SHA1('test')));
Run Code Online (Sandbox Code Playgroud)
给出相同的结果
SELECT PASSWORD('test');
Run Code Online (Sandbox Code Playgroud)
有了这个我继续。
我写了一个将字符串转换为 SHA1 Hash 的方法,它完美地工作(测试了几个不同的字符串,得到与 MySQL 中的 SHA1(str) 相同的结果)
接下来要做的是 UNHEX() 方法。我现在卡住了。
我目前的方法:
public static String toMySQLPasswordHash(String str)
{
String hash1 = toSHA1Hash(str);
String unhexedHash1 = new String(DatatypeConverter.parseHexBinary(hash1));
String hash2 = toSHA1Hash(unhexedHash1);
String passwordHash = "*" + hash2.toUpperCase();
return passwordHash;
}
Run Code Online (Sandbox Code Playgroud)
我的“toSHA1Hash”方法:
public static String toSHA1Hash(String str)
{
MessageDigest md = null;
try
{
md = MessageDigest.getInstance("SHA-1");
}
catch (NoSuchAlgorithmException e)
{
Logger.WriteLog(e.toString());
}
if (md …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 BluetoothGattCharacteristic 方法 setValue(..) 在香水分配器设备中写入十六进制值 0xFF 。我在回调方法 onCharacteristicWrite() 中获得成功状态代码 0 但设备不执行任何操作,理想情况下它应该发出香味.
下面是我写入特性的示例代码
private void writeCharacteristic(CallbackContext callbackContext, UUID serviceUUID, UUID characteristicUUID, byte[] data, int writeType) {
boolean success = false;
if (gatt == null) {
callbackContext.error("BluetoothGatt is null");
return;
}
BluetoothGattService service = gatt.getService(serviceUUID);
BluetoothGattCharacteristic characteristic = findWritableCharacteristic(service, characteristicUUID, writeType);
if (characteristic == null) {
callbackContext.error("Characteristic " + characteristicUUID + " not found.");
} else {
int data2=0xFF;
characteristic.setValue(data2, BluetoothGattCharacteristic.FORMAT_UINT16, 0);
characteristic.setWriteType(BluetoothGattCharacteristic.WRITE_TYPE_NO_RESPONSE);
writeCallback = callbackContext;
if (gatt.writeCharacteristic(characteristic)) {
success = true; …Run Code Online (Sandbox Code Playgroud) 我正在使用 IBM 的 mq 库从 MQ 队列读取消息。现在我需要检索消息的 messageid。我现在它在名称 messageId 下的消息标题中。但这会返回一个字节 []。现在我需要将其更改为可读字符串。
如何将 messageId 从 byte[] 转换为 string?
我尝试了几次转换,但没有一个有效:
new String(theMessage.messageId)
new String(theMessage.messageId, "UTF-8")
new String(theMessage.messageId, "UTF-16")
theMessage.messageId.toString()
Run Code Online (Sandbox Code Playgroud) 例如,我有一个字符串"DEADBEEF".如何将其转换为byte [] bytes = {0xDE,0xAD,0xBE,0xEF}?
例如,我得到一个字节串如下:3c3f786d6c2076657273696f6e3d22312e302220656e636f64696e673d225554462d38223f3e3c53 6f6170456e763a456e76656c6f706520786d6c6e733a536f6170456e763d22687474703a2f2f7363 68656d61732e786d6c736f61702e6f72672f736f61702f656e76656c6f70652f223e3c536f617045 6e763a48656164657220786d6c6e733a7773613d22687474703a2f2f7777772e77332e6f72672f32 3030352f30382f61646472657373696e67223e3c7773613a46726f6d3e3c7773613a416464726573 733e43484e594442473c2f7773613a416464726573733e3c2f7773613a46726f6d3e3c7773613a54 6f3e434352433c2f7773613a546f3e3c7773613a416374696f6e3e687474703a2f2f636372632e73 6572766963652e62616e6b636f6d6d2e636f6d2f6162737472616374696f6e2f61746f6d69632f74 6563686e6963616c2e506572736f6e616c4372656469745265706f7274536572762f4661756c743c 2f7773613a416374696f6e3e3c7773613a4d65737361676549443e75726e3a757569643a30303031
而且我知道底层文本是UTF-8编码,那么谁能提供一些方法将这些八位位组转换为可读字符串?