我目前正在深入研究Hyperledger Fabric,我无法从Java SDK开始(在这里谈论1.0.0-beta).是否有一个工作示例从连接到Fabric节点,进行查询等开始?到目前为止,我通过广泛的谷歌搜索找到的所有内容都是"让我们写一些链代码"的例子.
我有点迷茫.对于一个项目,我需要使用base 36将哈希函数(SHA256)的输出(字节数组)转换为String.
所以最后,我想转换哈希的(Hex-String表示),即
43A718774C572BD8A25ADBEB1BFCD5C0256AE11CECF9F9C3F925D0E52BEAF89
Run Code Online (Sandbox Code Playgroud)
到base36,所以上面的示例String将是:
3SKVHQTXPXTEINB0AT1P0G45M4KI8U0HR8PGB96DVXSTDJKI1
Run Code Online (Sandbox Code Playgroud)
对于实际转换为base36,我在StackOverflow上找到了一些代码:
public static String toBase36(byte[] bytes) {
//can provide a (byte[], offset, length) method too
StringBuffer sb = new StringBuffer();
int bitsUsed = 0; //will point how many bits from the int are to be encoded
int temp = 0;
int tempBits = 0;
long swap;
int position = 0;
while((position < bytes.length) || (bitsUsed != 0)) {
swap = 0;
if(tempBits > 0) {
//there are bits left over from previous iteration
swap …Run Code Online (Sandbox Code Playgroud) 我必须在不同平台和服务实现之间交换JSON对象,并通过数字签名使其完整性可验证.因此,平台A将创建这样的对象并创建数字签名.然后将所述签名包括在对象中并发送到平台B.JSON对象可以包含任意属性和数据.
例如在PHP中:
function signObject($jsonObjectToSign, $privateKey) {
$jsonObjectToSign->signature = "";
$msgToSign = json_encode($jsonObjectToSign);
openssl_sign($msgToSign, $jsonObjectToSign->signature, $privateKey, OPENSSL_SLGO_SHA1);
return $jsonObjectToSign;
}
Run Code Online (Sandbox Code Playgroud)
问题是,例如在Java中,无法判断JSON对象的属性是否与添加它们的顺序相同(通过JSONObject.put()).所以,如果我做了
$json = json_encode('{"a":1, "b":2}');
Run Code Online (Sandbox Code Playgroud)
在PHP中,如上所述签署此对象,将其传输到基于java的服务器,解码json对象,然后尝试验证签名,我可能会获得对象属性的不同顺序.
所以我需要的是一种从JSONObject创建String的可靠方法,与所使用的语言或平台无关.
上面的示例对象总是需要输出{"a":1, "b":2}而且永远不会{"b":2, "a":1}.不幸的是,这是例如在Java中的常见情况.
是否有任何"最佳实践"以安全的方式签署JSON对象?
但让我以另一种方式描述问题:
假设我想用Java(或任何其他语言)来做这件事:
JSONObject j = new JSONObject();
j.put("a", 1);
j.put("b", 2);
Run Code Online (Sandbox Code Playgroud)
现在,我需要一个序列化函数,它总是为这个对象输出相同的字符串表示,无论这个对象是如何以及用什么语言创建的.
我目前陷入了RSA密钥管理的问题.具体来说,我想在Java中创建RSA密钥对,签署一些内容(即字符串)将公钥,签名和签名的String导出到JSON文件中(是的,JSON!),将其导入另一个服务器使用PHP,并验证签名,这意味着我必须从JSON数据重新创建一个可用的密钥.
另外,我必须反过来做(在PHP中创建,在Java中验证)
另外,我需要将私钥导出为JSON(是的,JSON再次:)!并导出它.
所以在Java方面,一切似乎都很顺利.我可以创建密钥,将它们导出为JSON,重新导入它们并使用它们.创建和验证签名没有问题.这是代码:
创建密钥对:
public static final String ALGORITHM = "RSA";
public static final int KEYSIZE = 4096;
public static KeyPair createKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
keyPairGenerator.initialize(KEYSIZE);
return keyPairGenerator.genKeyPair();
}
Run Code Online (Sandbox Code Playgroud)
将密钥导出到String(最终将在JSON对象中) - 私钥的代码类似:
public static final String PUBLICKEY_PREFIX = "-----BEGIN PUBLIC KEY-----";
public static final String PUBLICKEY_POSTFIX = "-----END PUBLIC KEY-----";
public static String exportPublicKey(Key key) {
return PUBLICKEY_PREFIX + DatatypeConverter.printBase64Binary(key.getEncoded()) + PUBLICKEY_POSTFIX;
}
Run Code Online (Sandbox Code Playgroud)
例如,上述结果将是
"-----BEGIN PUBLIC KEY-----MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtBPxEtEWws2pPN5HCB795+nQyX23ZTKJt5PoMQQpwjOY/7U5ODkwHpuHWUhAuB1qTKTUdEWbe5x7WkD6/ksSib64Xq3jIeLQrfhj+g3bGsQjtca5LyIZ/J+G55l7k/Ny/lfQQNfquCcILHW7DrnzTb0D56IOBsR/r0Vv8ZvUxnaXUQtif8Q6dme8uoqzfnF46McqThnvPDxdHmhumb7tqPffzt35bRxFBvMcAWqW0FcPAeXD6cmsOBAATh/gVe1g5J89FyK8PhkNjW3uLMmknCTQg9KoWh4+DDRrLXxqSCBbaIRMCtbhShZOIbtjurJ+ZjhR/WSPnzJrl84rTjWG3Po6jsdtJ0pRHP4YnXXXJWhMt2oTOtHTQj4+99UX7Yuyp2tmFaEdQXvm3k/qbT9PBlwEovC2yqbFMcrM7sAW09NiSDdm1ipzV+vsOGuRXF2vtNX6pplifp5va5hQY/UqmlHSygvecImP5ennFOP7G62W/Q0w0qRzOXmFHN6Hsi8D1ZlWwgjyNahoX2yvgBMzy7MMYJcqiS9GOOETaenXTZViiipceGk96crjh6LG7RudMb+WN2yRXnjdWYd0GYPsaXz/faMohfXRXzRq/oIGZ4EdHhp9TknL2rCZmfR3N4Ozi1BkszAmmQeeNrUgxEjB8TdSer4p4DfR22NFcs9M3YkCAwEAAQ==-----END PUBLIC KEY-----"
Run Code Online (Sandbox Code Playgroud)
然后,我再次从JSON中读取键:
public static PublicKey importPublicKey(String key) …Run Code Online (Sandbox Code Playgroud) 我在创建/使用在PHP中创建和使用的RSA密钥时遇到问题.问题是,(公共和私人)密钥应该在不同服务器之间交换(例如,当移动用户帐户时).
现在,PHP的openssl-lib没有提供有关创建密钥的格式的任何详细信息.http://php.net/manual/en/function.openssl-pkey-export.php上的最新文档只是声明它是"PEM格式",但它没有说它是在PKCS#1还是PKCS#8
此外,私有密钥PEM的标头和预告片在PHP版本之间有所不同,如下面的代码所示:
<?php
$config = array(
"digest_alg" => 'sha512',
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA
);
$keyPair = openssl_pkey_new($config);
$privateKey = NULL;
openssl_pkey_export($keyPair, $privateKey);
var_dump($privateKey);
$keyDetails = openssl_pkey_get_details($keyPair);
$publicKey = $keyDetails['key'];
var_dump($publicKey);
die();
?>
Run Code Online (Sandbox Code Playgroud)
将输出不同的东西:
PHP v 5.4:
string(3272) "-----BEGIN PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqA//...
-----END PRIVATE KEY-----
"
string(800) "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAO//...
-----END PUBLIC KEY-----
"
Run Code Online (Sandbox Code Playgroud)
PHP v 5.5:
string(3272) "-----BEGIN RSA PRIVATE KEY-----
MIIJRAIBADANBgkqhkiG9w0BAQEFAASCCS4wggkqA//...
-----END RSA PRIVATE KEY-----
"
string(800) "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAO//...
-----END PUBLIC …Run Code Online (Sandbox Code Playgroud) 我在使用我的git存储库时遇到了一些麻烦,我无法找到错误:(
事实上,我已将此存储库用于PHP项目.一切都很好.然后,我"添加"了作曲家.即,我将作曲家文件复制到repositorie的根目录,创建了一个composer.json,并使用了"composer install".因此,composer.lock和vendor /是为我创建的.
由于我不希望那些被包含在回购中,我将以下内容添加到.gitignore中
composer
composer.lock
vendor/
Run Code Online (Sandbox Code Playgroud)
现在,每当我从root用户使用"git add"或"git commit"时,我都会收到以下错误:
$ git commit * -m "fixed issue #123"
error: pathspec 'composer' did not match any file(s) known to git.
error: pathspec 'composer.lock' did not match any file(s) known to git.
error: pathspec 'vendor' did not match any file(s) known to git.
Run Code Online (Sandbox Code Playgroud)
显然,提交(或添加)不起作用,因此我必须手动指定要添加或提交的文件.游民.
我找不到问题:(任何人都知道如何解决这个问题?
BTW我使用的是git版本2.4.9(Apple Git-60)
我在PHP 5.6中的一段代码中盘旋了一些错误,最后发现该错误是由对类的构造函数的过时调用引起的。在这里,我尝试将 3 个参数传递给只需要 2 个参数的构造函数。
仍然没有显示警告、错误或通知。
错误或功能?
根据我的理解,以下代码根本不起作用,但它甚至不会引起故障:
<?php
class x {
function __construct($a) {
}
}
$y = new x(1, 2);
?>
Run Code Online (Sandbox Code Playgroud)
有没有办法强制匹配参数计数?
我目前正在编写某种框架,允许其他人为它编写 REST 控制器。自然地,我希望那些“其他人”与我的代码中发生的事情有尽可能少的互动。
具体来说,我想要并且需要访问请求数据(即
RequestEntity在其余控制器处理请求之前。在控制器处理请求之前“拦截”请求,然后才让控制器处理它。
考虑以下代码:
@RestController
@RequestMapping("/")
public class MyController {
@GetMapping("/")
@ResponseBody
public ResponseEntity<String> getSomething(RequestEntity requestEntity) {
MyClass.doStuffWithRequestEntity(requestEntity);
// ...
Run Code Online (Sandbox Code Playgroud)
现在我需要的是ExternalClass.doStuffWithRequestEntity(requestEntity);在不需要明确调用它的情况下调用它。是否可以调用某个类中的某些方法(将 RequestEntity 传递给它!)而不必显式调用它?
此外,所述拦截器类应该创建和配置一个对象,然后该对象再次可供其余控制器使用。
我会想像
class RestController {
@RestController
@RequestMapping("/")
public class MyController {
@GetMapping("/")
@ResponseBody
public ResponseEntity<String> getSomething() {
MyClass x = MyClass.getInstanceCreatedByInterceptor();
}
}
}
Run Code Online (Sandbox Code Playgroud)
和
class Interceptor {
public void doStuffWithRequestEntity(requestEntity) {
MyClass x = new MyClass();
x.fillObjectWithData();
}
}
Run Code Online (Sandbox Code Playgroud)
之前被执行。
这个想法是解析每个(!)传入的请求并对其内容进行解码,而其余控制器的程序员根本不必关心这一点。他们应该只通过/从 MyClass 实例访问数据。
有没有办法做到这一点?
java ×4
php ×4
pki ×2
base36 ×1
constructor ×1
converter ×1
git ×1
interceptor ×1
json ×1
openssl ×1
php-openssl ×1
request ×1
rsa ×1
spring ×1