我正在为BlackBerry使用BlackBerry智能卡读卡器编写应用程序.没有太多关于这个主题的文档,所以我真的很想,如果有人能给我开始的例子.
基本上,卡上有一个RSA私钥和一个证书(用于配对的公钥).我希望能够加密/解密数据并对其进行签名.最终目标是使用智能卡上包含的客户端证书建立相互认证的SSL连接.
这是我到目前为止设法提出的代码:
SmartCardReader btReader = null;
SmartCardReader[] readers = SmartCardReaderFactory.getInstalledReaders();
for (int i = 0; i < readers.length; i++) {
SmartCardReader reader = readers[i];
if (reader.getType().equalsIgnoreCase("bluetooth")) {
btReader = reader;
break;
}
}
SmartCardReaderSession readerSession = reader.openSession();
CryptoSmartCard card = (CryptoSmartCard) readerSession.getSmartCard();
RSACryptoToken token = (RSACryptoToken) card.getCryptoToken("RSA");
Run Code Online (Sandbox Code Playgroud)
这token看起来很有希望 - 有一些很好的方法,但有"神秘"的论点.接下来做什么?
通过阅读各种材料,无论我理解什么,公钥 - 私钥对都是不对称加密的基础,也是选择2个素数(大致是你的私钥)并乘以它们(大致是你的公钥)的东西,我如果您知道私钥,则可能会生成公钥.这是正确的还是我错了什么?
[编辑]
让我更加困惑的是,只能使用私钥(使用.NET类RSACryptoServiceProvider)将RSA密钥序列化为XML .不确定这个限制是否有意!
以下问题比最初看起来更复杂.
假设我有一个任意的JSON对象,可能包含任何数量的数据,包括其他嵌套的JSON对象.我想要的是JSON数据的加密哈希/摘要,而不考虑实际的JSON格式本身(例如:忽略换行符和JSON令牌之间的间距差异).
最后一部分是一项要求,因为JSON将由许多不同平台上的各种(de)序列化程序生成/读取.我知道至少有一个Java的JSON库在反序列化期间读取数据时完全删除了格式.因此,它将打破哈希.
上面的任意数据子句也使事情变得复杂,因为它阻止我以给定顺序获取已知字段并在哈希之前连接它们(大致考虑Java的非加密hashCode()方法是如何工作的).
最后,将整个JSON字符串散列为一块字节(在反序列化之前)也是不可取的,因为在计算散列时应该忽略JSON中的字段.
我不确定这个问题有一个很好的解决方案,但我欢迎任何方法或想法=)
哈希和MAC(消息认证码)之间有什么区别?
根据他们的定义,他们似乎具有相同的功能.
有人可以解释一下有什么区别吗?
我们使用bcrypt来获取永远不需要解密的密码和数据.
应采取哪些措施来保护其他用户信息.对于这个例子,我们可以说,如果有人要获取数据库,我们不希望用户的真实姓名是纯文本.
这是一些有些敏感的数据,但也需要不时调用并以纯文本显示.有一个简单的方法吗?
我正在寻找一个相当于这个php调用的java:
hash_hmac('sha1', "test", "secret")
Run Code Online (Sandbox Code Playgroud)
我试过这个,使用java.crypto.Mac,但两人不同意:
String mykey = "secret";
String test = "test";
try {
Mac mac = Mac.getInstance("HmacSHA1");
SecretKeySpec secret = new SecretKeySpec(mykey.getBytes(),"HmacSHA1");
mac.init(secret);
byte[] digest = mac.doFinal(test.getBytes());
String enc = new String(digest);
System.out.println(enc);
} catch (Exception e) {
System.out.println(e.getMessage());
}
Run Code Online (Sandbox Code Playgroud)
key ="secret"和test ="test"的输出似乎不匹配.
我有两个应用程序在同一个java虚拟机中运行,并且都使用不同的密钥库和信任库.
一个可行的选择是使用单个密钥库并将所有其他密钥库导入共享密钥库(例如keytool -import),但如果我可以为在同一个jvm中运行的单独应用程序使用单独的密钥库,它将真正有助于我的要求.
我可以将keystore和truststore设置为jvm参数或系统属性,如下所示:
java -Djavax.net.ssl.keyStore=serverKeys
-Djavax.net.ssl.keyStorePassword=password
-Djavax.net.ssl.trustStore=serverTrust
-Djavax.net.ssl.trustStorePassword=password SSLApplication
Run Code Online (Sandbox Code Playgroud)
要么
System.setProperty("javax.net.ssl.keyStore","serverKeys")
Run Code Online (Sandbox Code Playgroud)
但是这种方法的问题在于它指定了要在JVM级别使用的密钥库/信任库,因此在同一JVM中运行的所有应用程序都获得相同的密钥库/信任库.
我还尝试创建自定义SSLContext并将其设置为默认值,但它还为在同一JVM中运行的所有应用程序设置上下文.
SSLContext context = SSLContext.getInstance("SSL");
context.init(kms, tms, null);
SSLContext.setDefault(context);
Run Code Online (Sandbox Code Playgroud)
我希望能够使用不同的密钥库/信任库而无需修改单个应用程序代码.
除了jre中的默认密钥库/证书之外,还可以动态注册多个密钥库的解决方案非常棒.
解决方案将以这种方式工作:
请让我知道您的想法或解决方案.提前致谢!
我正在开发一个Android应用程序,并且在发送到数据库之前有一些我想要加密的字符串.我想要一些安全,易于实现的东西,每次传递相同的数据时都会产生相同的东西,并且最好会产生一个字符串,无论传递给它的字符串有多大,它都会保持不变.也许我正在寻找哈希.
有没有人获得实践经验或参考实施符合PCI DSS安全标准的密钥管理方案的方案?
鉴于符合PCI DSS的公司数量,但显然有很多实现,但试图找到它们的细节是很困难的.当它归结为存储私有数据时,讨论通常会停止使用哪种加密算法.在此之后,通常会有关于正确存储私钥的声明,但没有讨论实际的方法,或者定期更改密钥或为应用程序提供密钥等.
具体而言,我对PCI DSS标准第3.5和3.6节的要求感兴趣.
3.5.2以尽可能少的位置和形式安全地存储加密密钥.
3.6.a验证用于加密持卡人数据的密钥是否存在密钥管理程序.注意:密钥管理的众多行业标准可从包括NIST在内的各种资源获得,可在http://csrc.nist.gov上找到.
3.6.4确认密钥管理程序的实施至少每年要求定期更改密钥.
我已经看过NIST Cryptographic出版物,正如PCI DSS要求文件所暗示的那样,但除了最近的加密密钥管理研讨会的注释之外,似乎没有太多真正可实现的方案或标准.
至于我想要做的事情不是:
所有这些都是有效的问题,但在这种情况下不是答案.我的要求的细节是一个不同的SO问题.Net设计模式,用于存储和检索敏感的每个用户数据,但这一切都归结为密钥管理,因此这个更精确的问题.
这就是我开始从以下方式获取md5哈希的方法string:
import "crypto/md5"
var original = "my string comes here"
var hash = md5.New(original)
Run Code Online (Sandbox Code Playgroud)
但显然这不是它的工作原理.有人能为我提供一份工作样本吗?
cryptography ×10
java ×3
hash ×2
.net ×1
android ×1
blackberry ×1
encryption ×1
go ×1
hmac ×1
javascript ×1
json ×1
jsse ×1
jvm ×1
md5 ×1
node.js ×1
pci-dss ×1
php ×1
rsa ×1
security ×1
smartcard ×1
ssl ×1
terminology ×1