我刚刚开始思考api密钥和密钥是如何工作的.就在2天前,我注册了Amazon S3并安装了S3Fox插件.他们问我的访问密钥和秘密访问密钥,这两个密钥都要求我登录访问.
所以我想知道,如果他们问我的密钥,他们一定要把它存放在某个地方吗?这与询问我的信用卡号码或密码并将其存储在自己的数据库中基本相同吗?
秘密密钥和API密钥如何工作?他们需要有多秘密?这些应用程序是否使用秘密密钥以某种方式存储它?
感谢您的见解.
(从这个线程产生,因为这实际上是一个问题,而不是NodeJS等)
我正在实现一个带有身份验证的REST API服务器,并且我已经成功实现了JWT令牌处理,以便用户可以使用用户名/密码通过/ login端口登录,在该端点上从服务器机密生成JWT令牌并返回到客户.然后,令牌在每个经过身份验证的API请求中从客户端传递到服务器,然后使用服务器机密来验证令牌.
但是,我正在努力了解有关如何以及在何种程度上验证令牌的最佳实践,以构建真正安全的系统.究竟什么应该参与"验证"令牌?是否可以使用server-secret验证签名,还是我还应该针对存储在服务器中的某些数据交叉检查令牌和/或令牌有效负载?
基于令牌的身份验证系统只会像在每个请求中传递用户名/密码一样安全,前提是获取令牌与获取用户密码相同或更困难.但是,在我看过的例子中,生成令牌所需的唯一信息是用户名和服务器端秘密.这不意味着假设一分钟恶意用户获得服务器机密的知识,他现在可以代表任何用户生成令牌,从而不仅可以访问一个给定用户,如果密码是获得了,但事实上对所有用户帐户?
这让我想到了一些问题:
1)JWT令牌验证是否应限于验证令牌本身的签名,单独依赖服务器机密的完整性,还是附带单独的验证机制?
在某些情况下,我已经看到了令牌和服务器会话的组合使用,在成功登录/ login端点后会建立会话.API请求验证令牌,并将令牌中找到的解码数据与会话中存储的某些数据进行比较.但是,使用会话意味着使用cookie,并且在某种意义上它违背了使用基于令牌的方法的目的.它也可能导致某些客户出现问题.
可以想象服务器将当前正在使用的所有令牌保存在内存缓存或类似内容中,以确保即使服务器机密被泄露,以便攻击者可以生成"有效"令牌,只有通过/ login端点生成的确切令牌会被接受.这是合理的还是只是多余/过度杀伤?
2)如果JWT签名验证是验证令牌的唯一方法,意味着服务器机密的完整性是一个突破点,那么应该如何管理服务器机密?从环境变量读取并在每个部署的堆栈中创建(随机化?)一次?定期重新创建或轮换(如果是这样,如何处理在轮换之前创建但需要在轮换之后进行验证的现有有效令牌,如果服务器在任何给定时间保持当前和之前的秘密,则可能就足够了) ?别的什么?
当谈到服务器机密被泄露的风险时,我可能只是过于偏执,这当然是一个需要在所有加密情况下解决的更普遍的问题......
我遇到了许多API,它们为用户提供了API 密钥和秘密.但我的问题是:两者之间有什么区别?
在我看来,一把钥匙就足够了.说我有一把钥匙,只有我和服务器知道它.我用这个键创建一个HMAC哈希并进行API调用.在服务器上,我们再次创建HMAC哈希并将其与发送的哈希进行比较.如果相同,则对呼叫进行身份验证.
那为什么要用两把钥匙?
编辑:或者是用于查找API密钥的API密钥?
我是Rails 4的新手,并且不理解在Rails 4中使用secret_key_baseunder config/secrets.yml.你能解释一下这个概念吗?
此外,当我在生产环境中我的工作,我提示设置secret_key有devise.rb,config.secret_key和secret_key_base.但是,我可以使用该rake secret命令生成一个新秘密.
开发和生产环境有什么区别?
secret_key当我secret_key_base每次生成时添加它时,它是如何匹配新生成的?
如何使用其他服务器保护应用程序?
如何在Laravel的whoops输出中隐藏我的密码和其他敏感环境变量?
有时其他人正在研究我的开发工作.如果抛出异常,我不希望他们看到这些秘密,但我也不想继续打开和关闭调试,或者只是为了快速预览而启动专用站点.
我正在为Mac OS X创建一个Twitter客户端,我有一个消费者秘密.根据我的理解,我不应该分享这个秘密密钥.问题是,当我把它作为字符串文字放入我的应用程序并使用它时,如下所示:
#define QQTwitterConsumerSecret @"MYSECRETYOUMAYNOTKNOW"
[[QQTwitterEngine alloc] initWithConsumerKey:QQTwitterConsumerKey consumerSecret:QQTwitterConsumerSecret];
Run Code Online (Sandbox Code Playgroud)
它位于我的应用程序的二进制文件的数据部分.黑客可以阅读此内容,反汇编应用程序等.
有没有安全的存储消费者秘密的方法?我应该加密吗?
我目前正在研究一种使用密钥加密/解密特定文件的功能.我写了三个类,一个生成一个密钥,一个用密钥加密文件,另一个用密钥加密.
生成密钥并加密文件可以正常工作,但是当我尝试解密文件时,会在行处抛出异常c.init(Cipher.DECRYPT_MODE, keySpec);::
java.security.InvalidKeyException:缺少参数
我认为我byte[]在解密文件时将密钥流式传输给我或者出错了我做错了.
快速解释这三个类:KeyHandler创建一个AES密钥并将其存储在硬盘上.密钥/明文/加密/解密文件的名称当前是硬编码的,用于测试目的.
EncryptionHandler将磁盘上的.txt文件转换为字节,使用密钥加密文件,然后使用加密字节写入磁盘CipherOutputStream.
DecryptionHandler当然是相反的EncryptionHandler.
这是代码:
public class KeyHandler {
Scanner scan = new Scanner(System.in);
public KeyHandler(){
try {
startMenu();
} catch (Exception e) {
System.out.println("fel någonstanns :)");
}
}
public void startMenu() throws Exception{
System.out.println("Hej. Med detta program kan du generera en hemlig nyckel"+"\n"+"Vill du:"+"\n"+ "1. Generera en nyckel"+"\n"+"2. Avsluta");
int val=Integer.parseInt(scan.nextLine());
do{
switch (val){
case 1: generateKey(); break;
case 2: System.exit(1);
default: System.out.println("Du måste välja …Run Code Online (Sandbox Code Playgroud) 我试图隐藏我在我的一个应用程序中使用的2个秘密.
据我所知,钥匙串是一个好地方,但我不能在提交应用程序之前添加它们.
我想到了这个场景 -
这样安全还是黑客可以看到这种情况并获得这些密钥?
*第三次编辑**很抱歉没有从头开始解释这个场景 - 该应用程序有许多级别,每个级别包含文件(音频,视频,图像).用户可以购买一个级别(IAP),购买完成后我需要将文件下载到他的设备.
对于iOS6,文件与Apple新的"托管内容"功能一起存储.对于iOS5,文件存储在amazon S3中.
所以在这个过程中我有2个键:1.IAP键,用于验证Apple IAP的购买.2. S3键,用于从iOS5用户获取S3的文件:
NSString *secretAccessKey = @"xxxxxxxxx";
NSString *accessKey = @"xxxxxxxxx";
Run Code Online (Sandbox Code Playgroud)
我是否需要保护这些密钥?我担心人们无需购买级别就可以从S3获取文件.或者黑客将能够构建一个黑客版本,其中包含预先下载的所有级别.
我在私有存储库后面的GitHub上有一个项目.我想公开回购.但是,我的项目使用密钥.
如何在保护这些密钥的"历史"的同时公开项目?我猜我是SOL,应该只是使密钥无效以防止它们被使用.
请注意,这与 如何开源使用API密钥的应用程序不同
要么
由于我的项目已经在Git上,因此可以轻松查看整个源历史记录.我想我能做的就是隐藏一个单独的项目,隐藏API密钥,然后公开回购.但是用户会错过整个分支历史,他们可能会对此感到好奇(我知道我会).
我想存储一个秘密密钥("abc123"),我将在我的REST API请求的标头中使用.我的服务器将检查此密钥.如果它匹配"abc123",则允许发出请求.
我正在考虑一个简单的解决方案,如:
let secret = "abc123"
Run Code Online (Sandbox Code Playgroud)
但这会有任何挫折吗?