← Extractions

Devise pitfalls and way to tighten security — Rafał Rothenberger at wroclove.rb 2022

Rafał Rothenberger's wroclove.rb 2022 talk examines security pitfalls in Devise: bcrypt's 72-byte password limit leaking peppers, how to fix it with Argon2id or HMAC preprocessing, using devise_token_auth with refresh tokens in HttpOnly cookies for APIs, and preventing enumeration and timing attacks via async jobs and rate limiting. Q&A covered external auth providers like Auth0 and whether the speaker had filed upstream issues.

Model
claude-opus-4-7
Ingestion
da5b91b8
Input tokens
499,306
fresh
351,550
cached
141,291
cache write
6,465
Output tokens
15,554
Duration
248.6s
Roundtrips
14
Tool calls
28
Cost
$0.00
Nodes/edges extracted
26 / 47
Read set (nodes/edges)
108 / 2

Nodes (26)

update Rafał Rothenberger person
attrs (empty) → {"role" => "software developer"}
description Conference speaker. → Conference speaker. Software developer at Monterail who describes himself as 'a bit of a security freak'. Delivered '...
short_description Conference speaker. → Software developer and security-minded Ruby engineer at Monterail.
create Monterail company
kind (empty) → company
name (empty) → Monterail
slug (empty) → monterail
attrs (empty) → {"industry" => "software consultancy"}
description (empty) → Software company where Rafał Rothenberger works as a software developer (transcribed as 'Montreal' in the automated t...
short_description (empty) → Polish software house employing Rafał Rothenberger.
update Devise pitfalls and way to tighten security talk
description Talk at wroclove.rb 2022. → Rafał Rothenberger's wroclove.rb 2022 talk about security edge cases in Devise. Covers: (1) bcrypt background — salt ...
short_description Talk at wroclove.rb 2022. → wroclove.rb 2022 talk on Devise security pitfalls, pepper leaks, tokens and enumeration attacks.
update Devise tool
description Popular Rails authentication gem. Has a love-hate reputation: per Ivan Nemytchenko's wroclove.rb 2018 audience survey... → Popular Rails authentication gem for password resets, sessions, registration and user management. Has a love-hate rep...
create bcrypt tool
kind (empty) → tool
name (empty) → bcrypt
slug (empty) → bcrypt
attrs (empty) → {"category" => "library"}
description (empty) → Password-hashing function (not a general hashing function). Takes fixed-size input and produces fixed-size output; mo...
short_description (empty) → Password-hashing function with a fixed 72-byte input limit.
create Argon2 tool
kind (empty) → tool
name (empty) → Argon2
slug (empty) → argon2
attrs (empty) → {"category" => "library"}
description (empty) → Password-hashing function, winner of the 2015 Password Hashing Competition. Argon2id variant recommended by Rafał Rot...
short_description (empty) → Modern password-hashing function, winner of the 2015 PHC.
create devise_token_auth tool
kind (empty) → tool
name (empty) → devise_token_auth
slug (empty) → devise_token_auth
attrs (empty) → {"category" => "library"}
description (empty) → Ruby gem providing opaque-token-based authentication for APIs, built to work alongside Devise so an application can k...
short_description (empty) → Token-based authentication gem complementing Devise for Ruby APIs.
create OWASP resource
kind (empty) → resource
name (empty) → OWASP
slug (empty) → owasp
attrs (empty) → {"type" => "documentation"}
description (empty) → Open Web Application Security Project. Maintains cheat-sheet series and guidance on everything web-application-securi...
short_description (empty) → Open Web Application Security Project — web security resources and cheat sheets.
create Auth0 company
kind (empty) → company
name (empty) → Auth0
slug (empty) → auth0
attrs (empty) → {"industry" => "identity and access management"}
description (empty) → Cloud identity-as-a-service provider mentioned in Q&A as an alternative to Devise. Rafał noted that offloading passwo...
short_description (empty) → Identity-as-a-service provider for authentication and user management.
create Salt concept
kind (empty) → concept
name (empty) → Salt
slug (empty) → salt
attrs (empty) → {"category" => "practice"}
description (empty) → Random string/bytes added to a password before hashing so that two users with the same password produce different has...
short_description (empty) → Random per-password value stored with the hash to prevent rainbow-table attacks.
create Pepper concept
kind (empty) → concept
name (empty) → Pepper
slug (empty) → pepper
attrs (empty) → {"category" => "practice"}
description (empty) → Random element added to the password during hashing that is kept as a secret outside the database (e.g. in applicatio...
short_description (empty) → Secret site-wide value added to passwords and stored outside the database.
create HMAC concept
kind (empty) → concept
name (empty) → HMAC
slug (empty) → hmac
attrs (empty) → {"category" => "pattern"}
description (empty) → Keyed hash construction (e.g. HMAC-SHA256) useful as a preprocessing step for passwords when stuck with bcrypt but wa...
short_description (empty) → Keyed hash construction usable to preprocess passwords with a secret pepper.
create Password Shucking concept
kind (empty) → concept
name (empty) → Password Shucking
slug (empty) → password-shucking
attrs (empty) → {"category" => "pattern"}
description (empty) → Attack on schemes that wrap a plain hash (e.g. SHA-256) inside bcrypt. Attackers use large databases of broken SHA-25...
short_description (empty) → Attack combining plain-hash pre-images with a bcrypt layer to break wrapped hashes.
create Enumeration Attack concept
kind (empty) → concept
name (empty) → Enumeration Attack
slug (empty) → enumeration-attack
attrs (empty) → {"category" => "pattern"}
description (empty) → Attack that lets a third party discover which email addresses or usernames have accounts on a service. Happens on reg...
short_description (empty) → Attack that discovers which accounts exist by observing form responses or timing.
create Timing-Based Enumeration concept
kind (empty) → concept
name (empty) → Timing-Based Enumeration
slug (empty) → timing-based-enumeration
attrs (empty) → {"category" => "pattern"}
description (empty) → Enumeration variant where the attacker measures response-time distributions for known-absent vs. candidate emails. Sy...
short_description (empty) → Using response-time differences to determine whether accounts exist.
create Using external auth providers instead of Devise question
kind (empty) → question
name (empty) → Using external auth providers instead of Devise
slug (empty) → using-external-auth-providers-instead-of-devise
attrs (empty) → {"answer_summary" => "External providers are great — less passwords is always better — but the token/refresh part of ...
description (empty) → Audience question asking about using third-party auth services like Auth0 to handle users and authentication instead ...
short_description (empty) → Q&A: what about services like Auth0 instead of Devise?
create Refresh Tokens in HttpOnly Cookies concept
kind (empty) → concept
name (empty) → Refresh Tokens in HttpOnly Cookies
slug (empty) → refresh-tokens-in-httponly-cookies
attrs (empty) → {"category" => "pattern"}
description (empty) → Pattern for API token auth: store long-lived refresh tokens in cookies rather than localStorage/sessionStorage. Cooki...
short_description (empty) → Storing long-lived refresh tokens in HttpOnly, Secure, SameSite cookies rather than JS storage.
create AES tool
kind (empty) → tool
name (empty) → AES
slug (empty) → aes
attrs (empty) → {"category" => "library"}
description (empty) → Symmetric encryption cipher. Mentioned by Rafał Rothenberger as an alternative to hashing when using a pepper: encryp...
short_description (empty) → Symmetric encryption cipher usable to encrypt passwords with a rotatable pepper.
create Use Argon2id when you need pepper takeaway
kind (empty) → takeaway
name (empty) → Use Argon2id when you need pepper
slug (empty) → use-argon2id-when-you-need-pepper
attrs (empty) → {"type" => "recommendation"}
description (empty) → If pepper is needed or unbounded-length passwords are desired, use Argon2id. It is the 2015 PHC winner, supports salt...
short_description (empty) → For new apps, replace bcrypt with Argon2id to get native salt+pepper support.
create Limit Devise password length to 72 bytes takeaway
kind (empty) → takeaway
name (empty) → Limit Devise password length to 72 bytes
slug (empty) → limit-devise-password-length-to-72-bytes
attrs (empty) → {"type" => "recommendation"}
description (empty) → If you stick with bcrypt in Devise, set the password length limit to 72 bytes (bytes, not characters) so that users d...
short_description (empty) → Align Devise password length with bcrypt's real limit to prevent silent truncation.
create Never store tokens in plain text takeaway
kind (empty) → takeaway
name (empty) → Never store tokens in plain text
slug (empty) → never-store-tokens-in-plain-text
attrs (empty) → {"type" => "recommendation"}
description (empty) → Tokens are passwords: possession of one lets you act as the user. Never store them in plain text; hash them in the da...
short_description (empty) → Treat tokens as passwords — hash them before writing to the database.
create Use devise_token_auth for API tokens takeaway
kind (empty) → takeaway
name (empty) → Use devise_token_auth for API tokens
slug (empty) → use-devise_token_auth-for-api-tokens
attrs (empty) → {"type" => "recommendation"}
description (empty) → For API authentication, prefer devise_token_auth — a simple, popular, secure-by-default opaque-token solution that co...
short_description (empty) → Prefer devise_token_auth over rolling custom token auth or JWTs.
create Keep refresh tokens in HttpOnly Secure SameSite cookies takeaway
kind (empty) → takeaway
name (empty) → Keep refresh tokens in HttpOnly Secure SameSite cookies
slug (empty) → keep-refresh-tokens-in-httponly-secure-samesite-cookies
attrs (empty) → {"type" => "recommendation"}
description (empty) → Store refresh tokens in cookies with HttpOnly (inaccessible to JavaScript), Secure (HTTPS only), SameSite=Strict (sen...
short_description (empty) → Put long-lived refresh tokens in server-controlled cookies, not JS-accessible storage.
create Make existence checks asynchronous to prevent enumeration takeaway
kind (empty) → takeaway
name (empty) → Make existence checks asynchronous to prevent enumeration
slug (empty) → make-existence-checks-asynchronous-to-prevent-enumeration
attrs (empty) → {"type" => "recommendation"}
description (empty) → On registration, password-reset and confirmation forms, do not check account existence synchronously. Schedule a Side...
short_description (empty) → Move registration/reset existence checks into background jobs so timing is constant.
create Rate-limit login forms with a skip path takeaway
kind (empty) → takeaway
name (empty) → Rate-limit login forms with a skip path
slug (empty) → rate-limit-login-forms-with-a-skip-path
attrs (empty) → {"type" => "recommendation"}
description (empty) → Login forms can't easily be made async, so rate-limit them to prevent timing-based enumeration. Limiting by email can...
short_description (empty) → Rate-limit login by email, but provide an easy way to fall back to IP-based limiting.
create Have you reported these issues upstream to Devise? question
kind (empty) → question
name (empty) → Have you reported these issues upstream to Devise?
slug (empty) → have-you-reported-these-issues-upstream-to-devise
attrs (empty) → {"answer_summary" => "He emailed Devise 3 months ago with no reply; plans a fix but notes breaking API changes in sec...
description (empty) → Audience question about whether the speaker filed an issue with the Devise maintainers. Answer: he emailed about the ...
short_description (empty) → Q&A: did you open an issue on the Devise repo?

Edges (47)

update Rafał Rothenberger → authored → Devise pitfalls and way to tighten security
context (empty) → Delivered this talk at wroclove.rb 2022.
create Rafał Rothenberger → attended → wroclove.rb 2022
context (empty) → Speaker at the conference.
relation (empty) → attended
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → cfc5cfd3-25a6-46c2-8b5d-626986c71c24
create Rafał Rothenberger → works_at → Monterail
attrs (empty) → {"role" => "software developer"}
context (empty) → Introduced himself as a software developer at Monterail.
relation (empty) → works_at
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → bb79602c-33cf-441b-a266-544ea3d8e4f4
update Devise pitfalls and way to tighten security → presented_at → wroclove.rb 2022
context (empty) → Talk delivered at wroclove.rb 2022.
create Devise pitfalls and way to tighten security → about → Devise
context (empty) → Entire talk documents security pitfalls in Devise.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Devise pitfalls and way to tighten security → about → bcrypt
context (empty) → Discusses bcrypt's 72-byte input limit and how Devise misuses it.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → bd34f1fa-f7bd-432d-a3e3-5cee01abfe25
create Devise pitfalls and way to tighten security → about → Argon2
context (empty) → Recommends Argon2id as the modern replacement for bcrypt.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 48217b19-5f30-46fa-82d8-58ddaa6e35a2
create Devise pitfalls and way to tighten security → about → devise_token_auth
context (empty) → Recommended solution for API token authentication alongside Devise.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → de4297ca-f228-4c07-a484-ad60ced09cd4
create Devise pitfalls and way to tighten security → about → Salt
context (empty) → Background section explains salt in password hashing.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 3d74db32-26f9-4949-8327-d39e91b6f438
create Devise pitfalls and way to tighten security → about → Pepper
context (empty) → Central to the Devise/bcrypt pepper-leak issue.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 76d1ae5f-49be-4a50-91d5-df0c84f2d8b0
create Devise pitfalls and way to tighten security → about → HMAC
context (empty) → Suggests HMAC-SHA256 as preprocessing when stuck with bcrypt plus pepper.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → b4f5dc79-4858-4ae2-9dc8-82f2edc18ad4
create Devise pitfalls and way to tighten security → about → Password Shucking
context (empty) → Explains why HMAC, not plain SHA, must be used to preprocess passwords.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → fd2430b9-42a9-42fb-8b7d-7a24c7295b0a
create Devise pitfalls and way to tighten security → about → Enumeration Attack
context (empty) → Dedicated section on enumeration attacks on registration/reset/login forms.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 9f6817c3-212a-4897-a050-6ec96be162b5
create Devise pitfalls and way to tighten security → about → Timing-Based Enumeration
context (empty) → Section on how timing leaks account existence even with neutralized messages.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 037240de-553a-4c8a-885c-24bbe414320d
create Devise pitfalls and way to tighten security → about → Refresh Tokens in HttpOnly Cookies
context (empty) → Section argues for refresh tokens in HttpOnly Secure SameSite cookies.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → b70269d9-8fc9-4dfc-935b-53753037f174
create Devise pitfalls and way to tighten security → about → AES
context (empty) → Mentions encrypting passwords with AES (Dropbox-style) as pepper-rotation alternative.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → d98cffd9-2a67-4d4b-88c7-eea0bddeaebf
create Devise pitfalls and way to tighten security → about → OWASP
context (empty) → Cites OWASP cheat sheets as a recommendation source for password hashing.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → e9952c7c-7f1d-4bbb-9d3b-8c839d1f1d19
create Devise pitfalls and way to tighten security → about → Sidekiq
context (empty) → Recommends moving existence checks into Sidekiq jobs to prevent timing enumeration.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → 2365c22d-c83e-4553-b865-ec22d0b5b225
create Devise pitfalls and way to tighten security → about → Galileo Galilei
context (empty) → Jokingly invokes Galileo's unit of time when introducing timing attacks.
relation (empty) → about
source_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
target_node_id (empty) → e175920b-8e1c-419e-8a72-d15d89f07e78
create Rafał Rothenberger → recommends → Argon2
context (empty) → Recommends Argon2id as Devise replacement when pepper is needed.
relation (empty) → recommends
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → 48217b19-5f30-46fa-82d8-58ddaa6e35a2
create Rafał Rothenberger → recommends → devise_token_auth
context (empty) → Explicitly recommends it for API token authentication.
relation (empty) → recommends
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → de4297ca-f228-4c07-a484-ad60ced09cd4
create Rafał Rothenberger → recommends → OWASP
context (empty) → Recommends the OWASP cheat-sheet series for web application security.
relation (empty) → recommends
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → e9952c7c-7f1d-4bbb-9d3b-8c839d1f1d19
create Rafał Rothenberger → recommends → Refresh Tokens in HttpOnly Cookies
context (empty) → Advocates storing refresh tokens in HttpOnly Secure SameSite cookies.
relation (empty) → recommends
source_node_id (empty) → 93350e8e-015f-44d6-ac36-17096d5c834a
target_node_id (empty) → b70269d9-8fc9-4dfc-935b-53753037f174
create Use Argon2id when you need pepper → from_talk → Devise pitfalls and way to tighten security
context (empty) → Primary remediation recommended in the talk.
relation (empty) → from_talk
source_node_id (empty) → 901e5904-7d4e-43a4-93a2-84ec1eea0c01
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Use Argon2id when you need pepper → about → Argon2
context (empty) → Recommendation is about adopting Argon2id.
relation (empty) → about
source_node_id (empty) → 901e5904-7d4e-43a4-93a2-84ec1eea0c01
target_node_id (empty) → 48217b19-5f30-46fa-82d8-58ddaa6e35a2
create Limit Devise password length to 72 bytes → from_talk → Devise pitfalls and way to tighten security
context (empty) → Alternative mitigation for teams staying on bcrypt.
relation (empty) → from_talk
source_node_id (empty) → c290efa6-8522-47e4-ab99-480b2a3f1036
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Limit Devise password length to 72 bytes → about → Devise
context (empty) → Concrete configuration change for Devise.
relation (empty) → about
source_node_id (empty) → c290efa6-8522-47e4-ab99-480b2a3f1036
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Never store tokens in plain text → from_talk → Devise pitfalls and way to tighten security
context (empty) → Stated as a rule: tokens are passwords.
relation (empty) → from_talk
source_node_id (empty) → 0b3688aa-dcc9-4cfe-908b-46b12683d6ab
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Use devise_token_auth for API tokens → from_talk → Devise pitfalls and way to tighten security
context (empty) → Recommendation for API authentication.
relation (empty) → from_talk
source_node_id (empty) → bf141786-c255-4381-af91-10c20c179f39
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Use devise_token_auth for API tokens → about → devise_token_auth
context (empty) → Recommends this specific gem.
relation (empty) → about
source_node_id (empty) → bf141786-c255-4381-af91-10c20c179f39
target_node_id (empty) → de4297ca-f228-4c07-a484-ad60ced09cd4
create Keep refresh tokens in HttpOnly Secure SameSite cookies → from_talk → Devise pitfalls and way to tighten security
context (empty) → Central recommendation of the refresh-token section.
relation (empty) → from_talk
source_node_id (empty) → b19a2719-ad4e-410e-8d36-e90b3577331d
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Keep refresh tokens in HttpOnly Secure SameSite cookies → about → Refresh Tokens in HttpOnly Cookies
context (empty) → Restates the HttpOnly-cookie pattern as a recommendation.
relation (empty) → about
source_node_id (empty) → b19a2719-ad4e-410e-8d36-e90b3577331d
target_node_id (empty) → b70269d9-8fc9-4dfc-935b-53753037f174
create Make existence checks asynchronous to prevent enumeration → from_talk → Devise pitfalls and way to tighten security
context (empty) → Core mitigation for timing-based enumeration.
relation (empty) → from_talk
source_node_id (empty) → e6e08fb2-58cb-4e19-acf5-8db5b8acb660
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Make existence checks asynchronous to prevent enumeration → about → Timing-Based Enumeration
context (empty) → Prevents timing attacks by constant-time responses.
relation (empty) → about
source_node_id (empty) → e6e08fb2-58cb-4e19-acf5-8db5b8acb660
target_node_id (empty) → 037240de-553a-4c8a-885c-24bbe414320d
create Make existence checks asynchronous to prevent enumeration → about → Sidekiq
context (empty) → Uses Sidekiq background jobs as the mechanism.
relation (empty) → about
source_node_id (empty) → e6e08fb2-58cb-4e19-acf5-8db5b8acb660
target_node_id (empty) → 2365c22d-c83e-4553-b865-ec22d0b5b225
create Rate-limit login forms with a skip path → from_talk → Devise pitfalls and way to tighten security
context (empty) → Recommendation for login forms where async check isn't feasible.
relation (empty) → from_talk
source_node_id (empty) → 1a5f75ed-3aee-4783-a235-c21c873a7da8
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Rate-limit login forms with a skip path → about → Enumeration Attack
context (empty) → Prevents enumeration on login forms via rate limiting.
relation (empty) → about
source_node_id (empty) → 1a5f75ed-3aee-4783-a235-c21c873a7da8
target_node_id (empty) → 9f6817c3-212a-4897-a050-6ec96be162b5
create Using external auth providers instead of Devise → asked_at → Devise pitfalls and way to tighten security
context (empty) → Asked during Q&A after the talk.
relation (empty) → asked_at
source_node_id (empty) → f0af6e23-2462-487f-acbc-3e34b44919f7
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Using external auth providers instead of Devise → about → Auth0
context (empty) → Specifically asked about Auth0.
relation (empty) → about
source_node_id (empty) → f0af6e23-2462-487f-acbc-3e34b44919f7
target_node_id (empty) → 64154eec-fcd9-43eb-8d6d-7276f55dbb2c
create Using external auth providers instead of Devise → about → Devise
context (empty) → Comparing external providers with Devise.
relation (empty) → about
source_node_id (empty) → f0af6e23-2462-487f-acbc-3e34b44919f7
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Have you reported these issues upstream to Devise? → asked_at → Devise pitfalls and way to tighten security
context (empty) → Asked during Q&A.
relation (empty) → asked_at
source_node_id (empty) → 856a9372-07d1-4d16-89de-d741ebcc8baa
target_node_id (empty) → e6de36cb-0179-45f5-a1c3-164fe0066ca4
create Have you reported these issues upstream to Devise? → about → Devise
context (empty) → About the Devise maintainers' response to security reports.
relation (empty) → about
source_node_id (empty) → 856a9372-07d1-4d16-89de-d741ebcc8baa
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Devise → uses → bcrypt
context (empty) → Devise uses bcrypt for password hashing by default.
relation (empty) → uses
source_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
target_node_id (empty) → bd34f1fa-f7bd-432d-a3e3-5cee01abfe25
create Devise → uses → Pepper
context (empty) → Devise supports an application-level pepper, appended to the password before bcrypt.
relation (empty) → uses
source_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
target_node_id (empty) → 76d1ae5f-49be-4a50-91d5-df0c84f2d8b0
create devise_token_auth → related_to → Devise
context (empty) → Built to complement Devise for token-based API authentication.
relation (empty) → related_to
source_node_id (empty) → de4297ca-f228-4c07-a484-ad60ced09cd4
target_node_id (empty) → 9113bde3-534a-47d0-8333-e171c4b55e79
create Argon2 → uses → Salt
context (empty) → Argon2 takes salt as an explicit argument rather than appending it.
relation (empty) → uses
source_node_id (empty) → 48217b19-5f30-46fa-82d8-58ddaa6e35a2
target_node_id (empty) → 3d74db32-26f9-4949-8327-d39e91b6f438
create Argon2 → uses → Pepper
context (empty) → Argon2 supports pepper as an explicit argument.
relation (empty) → uses
source_node_id (empty) → 48217b19-5f30-46fa-82d8-58ddaa6e35a2
target_node_id (empty) → 76d1ae5f-49be-4a50-91d5-df0c84f2d8b0

Read set

108 nodes

tool Devise search_nodes tool Tyrant search_nodes tool Active Admin search_nodes concept Strong Parameters search_nodes tool activerecord-multi-tenant search_nodes talk Securing Rails applications search_nodes tool acts_as_tenant search_nodes tool JSON API Resources search_nodes talk Devise pitfalls and way to tighten security search_nodes+get_node_edges talk Multi-region data governance in Rails application search_nodes tool Brotli search_nodes takeaway Signed On-the-fly URLs search_nodes concept Unique Per-Site Email Leak Detection search_nodes event wroclove.rb 2022 search_nodes event wroclove.rb 2023 search_nodes event wroclove.rb 2024 search_nodes event wroclove.rb 2019 search_nodes event wroclove.rb 2018 search_nodes event wroclove.rb 2026 search_nodes event wroclove.rb 2025 search_nodes talk Building LLM powered applications in Ruby search_nodes talk Data Management With Ruby search_nodes talk Fix Production Bugs 20x Faster search_nodes takeaway Switch on HTTP/2 search_nodes takeaway Contribute to Arkency aggregates repository search_nodes tool acts_as_api search_nodes tool Pundit search_nodes resource awesome-ddd search_nodes tool Codecov search_nodes question Protecting against ffmpeg vulnerabilities search_nodes tool webpagetest.org search_nodes concept Breadth-First Search for Code Removal search_nodes takeaway Be kind and build useful things search_nodes question DDoS risk of on-the-fly processing search_nodes person Rafał Rothenberger get_node_edges company SpaceX search_nodes project monolith framework search_nodes takeaway Name Things To Find Their Properties search_nodes project Ruby Romania search_nodes tool RealtimeBoard search_nodes company Transloadit search_nodes tool Tailwind CSS search_nodes tool Sync Space VR search_nodes tool MobX search_nodes takeaway Trailblazer tracing saves thousands of debugging hours search_nodes talk Is the monolith a problem search_nodes company Visuality search_nodes talk International cooperation in IT teams search_nodes talk Enterprise Rails Panel search_nodes tool BME280 search_nodes talk Events events events search_nodes project Petri Nets Performance Prediction Gem search_nodes concept Logux Proxy search_nodes tool GraphQL search_nodes resource Rocket Real-Time Benchmark search_nodes concept Service Autonomy search_nodes concept Function as a Service search_nodes talk Building a Production-Ready AI App: MCP & OAuth on Rails search_nodes concept Direct Upload to Cloud search_nodes concept Waterfall Analysis search_nodes takeaway Timeline Diagrams Reveal Possible Race Conditions search_nodes concept Timeline Visualization search_nodes takeaway Replay-Based Debugging search_nodes concept Stalling For Time search_nodes concept Page Load Time Budget search_nodes tool Sidekiq search_nodes takeaway Prefer Small Sidekiq Jobs search_nodes concept Sidekiq Batches search_nodes takeaway Keep Sidekiq Job Parameters Simple search_nodes question Scaling Sidekiq Elastically search_nodes question Application-Level Back Pressure For Sidekiq search_nodes talk Under The Hood And On The Surface Of Sidekiq search_nodes question Wrapper Job vs Logic In Job search_nodes talk Sidekiq Batches Lightning Talk search_nodes question Sidekiq Retry Race Condition Fixed In 7 search_nodes question Isn't asking password confirmation business logic? search_nodes takeaway Use Unique Per-Site Emails To Catch Leaks search_nodes question How does GDPR deletion work if encrypted events are in backups? search_nodes concept tus protocol search_nodes tool DBM / SDBM / GDBM search_nodes concept Cynefin Framework search_nodes concept HTTP Method Idempotence search_nodes concept JSON API search_nodes takeaway Don't follow JSON API religiously search_nodes question JSON API or GraphQL — what do you recommend? search_nodes concept Aspect-Oriented Programming search_nodes talk Ever shorter feedback loop search_nodes talk Lightning Talk on Email Leaks and Senior Developer Titles search_nodes talk One machine please, make it Turing search_nodes concept HTTP/2 Server Push search_nodes concept HTTP Caching with ETag and Last-Modified search_nodes tool Uppy search_nodes concept Preloading and Prefetching search_nodes talk Counterintuitive Rails pt. 1 search_nodes talk Nightmare neighbours caveats of Rails based mutlitenancy search_nodes question What is an enterprise Rails application? search_nodes resource Rails Architect Master Class search_nodes talk Toolbelt of a Seasoned Bug Hunter search_nodes talk Better WebPerformance with Rails search_nodes tool Ruby on Rails search_nodes tool Ember.js search_nodes tool Rack search_nodes tool Discourse search_nodes tool Ruby search_nodes tool Heroku search_nodes talk Towards the post framework future search_nodes person Galileo Galilei search_nodes talk Functional Programming as Naming Lightning Talk search_nodes

2 edges